java中判断对象相等需区分引用相等(==)和内容相等(equals()):==比较内存地址,equals()需重写以实现逻辑相等,自定义类须遵循规范并同步重写hashcode()。

Java中判断两个对象是否相等,关键要分清“引用相等”和“内容相等”两种场景——前者看内存地址是否相同,后者看逻辑意义是否一致。不加区分地使用==或equals(),极易引发bug。
用 == 判断引用地址是否相同
== 比较的是变量所指向的内存地址,适用于基本类型直接比数值,而对引用类型则只反映是否指向同一个对象实例。
- 对于
new String("abc")创建的字符串,即使内容一样,==也返回false,因为是不同对象 - 字符串字面量如
"abc" == "abc"可能为true,这是字符串常量池优化的结果,但不可依赖 - 包装类(如
Integer)在 -128~127 范围内可能因缓存复用导致==偶然成立,超出范围则一定为false
用 equals() 判断内容是否相等
equals() 默认行为与 == 相同,但设计初衷是让子类重写以实现逻辑相等。正确使用需满足以下前提:
- 目标类必须重写了
equals(Object)方法(如String、ArrayList、LocalDateTime等均已实现) - 重写时应遵循对称性、传递性、一致性、非空性等约定,通常搭配
Objects.equals(a, b)安全调用 - 若自定义类需比较内容,必须手动重写
equals()(并同步重写hashCode())
自定义类如何正确实现 equals()
以一个 User 类为例,若认为 id 相同即为同一用户,则应这样写:
- 先用
==快速判断是否为同一引用,提升性能 - 检查参数是否为
null或类型不匹配,避免空指针和类型异常 - 逐个比较关键字段:基本类型用
==,引用类型用Objects.equals() - IDE(如 IntelliJ)可自动生成符合规范的
equals()和hashCode()
数组、集合、嵌套对象的相等判断
标准 equals() 对数组无效(数组继承自 Object,仍按引用比较),需用工具方法:
- 一维数组用
Arrays.equals(arr1, arr2);多维数组用Arrays.deepEquals() - 集合之间直接用
list1.equals(list2)即可(前提是元素类型已正确定义equals()) - 含嵌套对象时,确保所有层级的类都正确实现了
equals(),否则比较会停留在引用层面
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











