Java中判断对象相等需区分引用相等(==)和逻辑相等(equals()):==对基本类型比值,对引用类型比地址;equals()默认同==,重写后按业务字段比较,且必须同步重写hashCode以保证集合正确性。

Java 中判断两个对象是否相等,核心在于区分“引用相等”和“逻辑相等”,不能一概而用 == 或 equals(),得看你要比什么。
用 == 比较:看是不是同一个对象
它只检查两个引用是否指向内存中同一块地址:
- 对基本类型(如
int、char),==比的是值,没问题 - 对引用类型(如
String、自定义User),==比的是地址,不是内容 - 即使两个对象字段完全一样,只要不是同一个实例,
==就返回false
适合场景:单例校验、避免重复初始化、确认对象身份而非内容。
用 equals() 比较:看业务上是否“算同一个”
默认的 equals() 来自 Object 类,行为等同于 ==。要让它按字段比内容,必须重写:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 重写时需遵守五个契约:自反性、对称性、传递性、一致性、非空性
- 典型写法:先判
this == obj和null,再用getClass() != obj.getClass()防止子类误判,最后逐个比较关键业务字段(如id、orderNo) - IDE(如 IDEA)生成的
equals通常也同时生成hashCode,这是必须的——若两个对象equals返回true,它们的hashCode必须相同,否则在HashMap、HashSet中会出错(比如去重失败)
字符串等常用类已帮你重写好了
String、Integer、LocalDate 等 JDK 类都重写了 equals(),直接比内容:
"abc".equals("abc") → truenew Integer(100).equals(new Integer(100)) → true- 但注意:
new Integer(200).equals(new Integer(200))在某些 JVM 版本下可能为false(缓存范围外),所以推荐用Objects.equals(a, b)安全兜底
集合去重或 Map 键匹配时,必须同时重写 equals 和 hashCode
例如把自定义对象放进 HashSet 或作为 HashMap 的 key:
- 只重写
equals不重写hashCode:对象内容相同,但因哈希值不同被当成不同 key,导致重复插入 - 只重写
hashCode不重写equals:哈希值相同却无法识别逻辑相等,查找失败 - 正确做法:二者成对出现,且依据相同字段计算(如都基于
id和name)

















