重写 equals 方法需满足自反性、对称性、传递性、一致性、非空性,并配合 hashcode 重写;标准步骤包括判空、引用检查、类型判断、强转及字段比较,推荐用 objects.equals 和 objects.hash。

在 Java 中重写 equals 方法,核心是让两个对象在“逻辑上相等”时返回 true,而不是仅靠内存地址判断。这必须配合 hashCode 一起重写,否则会破坏哈希集合(如 HashMap、HashSet)的正确性。
遵守 equals 的通用约定
Java 规定 equals 必须满足五个条件:自反性、对称性、传递性、一致性、非空性。违反任一条件都可能导致不可预期行为。例如,若 A.equals(B) 为 true,但 B.equals(A) 为 false,就破坏了对称性——常见于未做类型检查或强制转换前未校验。
标准重写步骤(以 Person 类为例)
假设有一个 Person 类,含 name(String)、age(int)两个关键字段:
- 第一步:参数判空 ——
if (obj == null) return false; - 第二步:引用相等检查 ——
if (this == obj) return true; - 第三步:类型检查 ——
if (!(obj instanceof Person)) return false;(推荐用instanceof,比getClass() == obj.getClass()更灵活,也更常用) - 第四步:强转并逐字段比较 ——
Person p = (Person) obj;,然后比较Objects.equals(name, p.name)和age == p.age - 第五步:所有字段都相等才返回
true
别忘了同步重写 hashCode
hashCode 必须保证:如果两个对象 equals 返回 true,它们的 hashCode 值必须相同。推荐用 Objects.hash(name, age) 生成,简洁且安全。手写时避免用随机数、时间戳或可变字段(如未初始化的懒加载属性),否则会破坏哈希结构稳定性。
IDE 可以自动生成,但要注意细节
IntelliJ 或 Eclipse 都支持快捷生成 equals 和 hashCode。生成后需人工确认:是否包含了所有参与逻辑相等判断的字段?是否排除了数据库 ID、创建时间等非业务字段?是否处理了可能为 null 的引用类型(用 Objects.equals 比直接调用 .equals() 更安全)?
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











