0

0

如何在Java中判断两个对象是否相等_equals方法重写与内存地址对比

P粉602998670

P粉602998670

发布时间:2026-03-14 15:57:56

|

997人浏览过

|

来源于php中文网

原创

== 比较的是对象引用(内存地址),不是内容;equals() 默认也等价于 ==,需重写以按业务字段比较,并必须同步重写 hashCode() 以满足哈希契约。

如何在java中判断两个对象是否相等_equals方法重写与内存地址对比

直接用 == 比较两个对象,到底在比什么

它比的是内存地址,不是内容。哪怕两个 String 字面值完全一样,如果一个是字面量、一个是 new String("abc")== 就返回 false

常见错误现象:user1 == user2 返回 false,但你明明看到字段一模一样;或者测试里用 assertThat(obj1 == obj2) 断言失败,以为逻辑错了,其实是误用了引用比较。

  • 只有 String 字面量、小范围整数(-128~127)的 Integer 等少数情况,== 才可能碰巧“看起来对”——靠的是 JVM 的常量池或缓存机制,不是语义保证
  • 自定义类几乎从不适用 == 判断“相等”,除非你明确想确认是不是同一个实例(比如单例校验、状态机中的身份判断)
  • 集合操作如 list.contains(obj)set.add(obj) 内部都依赖 equals(),不是 ==;用错会导致查不到、重复添加等问题

equals() 不重写就用 Object 默认实现,后果很实在

默认的 equals() 方法来自 Object 类,内部就是 return (this == obj); —— 和 == 完全等价。

所以如果你没重写,所有“按字段相等”的需求都会失效。比如两个 User 对象 id 和 name 都相同,user1.equals(user2) 依然返回 false

立即学习Java免费学习笔记(深入)”;

  • IDE 自动生成的 equals()(如 IntelliJ 的 Alt+Insert)通常靠谱,但要注意勾选哪些字段:ID 类字段一般要包含,时间戳、缓存字段、临时状态字段通常不该参与比较
  • 如果类有继承关系,父类已重写 equals(),子类重写时必须调用 super.equals(other),否则可能破坏对称性
  • 别在 equals() 里做耗时操作(比如读数据库、远程调用),它可能被高频调用(如 HashMap.get()

重写 equals() 必须同步重写 hashCode(),不然 HashMap、HashSet 直接失灵

hashCode()equals() 的配套契约:如果两个对象 equals() 返回 true,它们的 hashCode() 必须相同;反之不成立。

PixVerse
PixVerse

PixVerse是一款强大的AI视频生成工具,可以轻松地将多种输入转化为令人惊叹的视频。

下载

不遵守这个规则,对象放进 HashMap 后可能再也取不出来——因为哈希桶位置算错了。

  • IDE 自动生成的 hashCode() 通常和 equals() 用的字段一致,只要两者字段选择同步更新,基本不会出问题
  • 避免用可变字段(如 statuslastModified)参与 hashCode() 计算,否则对象放入 HashSet 后改了字段,就再也找不到了
  • 如果类是不可变的(final 字段 + 无 setter),hashCode() 可以懒计算并缓存,提升性能

Objects.equals() 是 null 安全的快捷写法,但别滥用在核心逻辑里

Objects.equals(a, b) 能自动处理 abnull 的情况,比手写 a != null && a.equals(b) 简洁。

但它只是工具方法,底层还是调用你重写的 equals()。如果那个 equals() 本身写错了,Objects.equals() 也救不了。

  • 适合用在参数校验、日志拼接、DTO 转换等非关键路径;不要用它掩盖 equals() 实现缺陷
  • 注意它不能替代字段级空检查:比如你想确保 user.getName() 不为 null 再比较,得先判空,而不是依赖 Objects.equals(user.getName(), "admin")
  • 泛型擦除下,Objects.equals() 对原始类型(int, boolean)会自动装箱,高频调用时有轻微 GC 开销,不过绝大多数场景可忽略

最容易被忽略的一点:重写 equals() 前,先想清楚“相等”的业务定义是什么。ID 相同就算相等?还是所有字段都得一致?是否允许部分字段忽略(比如创建时间)?这个定义一旦定下来,hashCode()、序列化、数据库唯一约束都要跟上,不是改两个方法就完事的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

367

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1109

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 82.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号