Java 中 equals 和 hashCode 的正确理解

Java 中 equals 和 hashCode 的正确理解

Java 里判断对象是否相等,不能只看 ==== 比较的是引用地址,equals 通常表示业务意义上的相等。只要重写 equals,一般也要重写 hashCode,否则对象放进 HashMap、HashSet 这类集合后会出现很难排查的问题。

一个最小例子

public class User {
private Long id;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}

@Override
public int hashCode() {
return Objects.hash(id);
}
}

为什么 hashCode 也要改

HashSet 判断元素是否重复时,会先看 hashCode,再看 equals。如果两个对象 equals 相等,但 hashCode 不一样,它们可能会被放到不同桶里,集合就会认为它们不是同一个对象。

验证方式

写一个简单测试:创建两个 id 相同的 User,放进 HashSet,最后 size 应该是 1。

Set<User> users = new HashSet<>();
users.add(new User(1L));
users.add(new User(1L));
System.out.println(users.size()); // 期望输出 1

   转载规则


《Java 中 equals 和 hashCode 的正确理解》 小乐 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录