重写 equals 方法需确保逻辑相等时返回 true,并必须同步重写 hashCode;标准步骤包括:先判引用相等,再判 null 和类类型,最后用 Objects.equals 比较字段,用 Objects.hash 生成哈希值。

Java 中重写 equals 方法,核心是让两个对象在“逻辑上相等”时返回 true,而不是仅靠内存地址判断(即避免默认的 Object.equals 行为)。这通常用于自定义类中比较对象的内容是否一致。
必须同时重写 hashCode 方法
只要重写了 equals,就必须重写 hashCode,否则会破坏哈希集合(如 HashMap、HashSet)的契约:相等的对象必须有相同的哈希值。
- 如果两个对象
equals返回 true,它们的hashCode必须相同 - 反之不强制:
hashCode相同,equals不一定为 true
标准重写步骤(推荐使用 Objects.equals 和 Objects.hash)
从 Java 7 开始,java.util.Objects 提供了安全、简洁的工具方法,避免空指针和冗长判断:
- 用
Objects.equals(a, b)比较字段:自动处理 null(比如一个为 null、另一个非 null 时返回 false) - 用
Objects.hash(field1, field2, ...)生成哈希值,内部已处理 null - 先检查
this == obj(同一对象,快速返回 true) - 再检查
obj == null || getClass() != obj.getClass()(类型必须严格一致,避免跨子类误判)
一个典型示例(Person 类)
public class Person {
private String name;
private int age;
// 构造器、getter 省略...
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
注意:getClass() != obj.getClass() 比 !(obj instanceof Person) 更严格,能防止子类对象与父类对象被误判为相等(符合 Liskov 替换原则的常见实践)。
立即学习“Java免费学习笔记(深入)”;
常见错误要避开
- 忘记检查
null或类型,导致NullPointerException或逻辑错误 - 只重写
equals不重写hashCode,放进HashSet后无法查到对象 - 在
equals中使用可变字段(如未设 final 的属性),后续修改会导致集合行为异常 - 比较时用了
==比字符串或包装类(应统一用Objects.equals)


















