Java 核心:hashCode 与 equals 的正确姿势
很多 Java 开发者学了一段时间后,对 hashCode 方法的作用依然模糊。要搞懂它,得先从 Java 集合框架说起。
Java 集合主要分为两类:List 和 Set。List 有序且允许重复,Set 无序且要求元素唯一。这就引出了一个关键问题:如何判断两个元素是否'重复'?
靠 equals 方法吗?理论上可以,但如果集合里有几千个元素,每加一个新元素都要遍历比较一遍,性能开销太大了。
所以 Java 引入了哈希表(Hash Table)机制。简单来说,hashCode 返回一个整数值,相当于给对象分配了一个'桶位'。添加元素时,先算哈希值找到对应位置:
- 如果该位置没人,直接存进去;
- 如果有人,再调用 equals 比对。
这样就把大量的比较工作降到了最低。不过,这里有个铁律:如果两个对象通过 equals 判断为相等,它们的 hashCode 必须相同。 反之则不一定成立。如果不遵守这个约定,在 HashSet 或 HashMap 里可能会出现重复元素,或者根本取不到数据。
实战代码示例
下面是一个商品类的实现,展示了如何重写这两个方法:
public class Product {
private int id;
private String name;
public Product() {
super();
}
public Product(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
.name = name;
}
{
(obj == ) ;
(obj Product) {
(Product) obj;
name != && name.equals(p.name);
}
;
}
{
;
result = * result + (name == ? : name.hashCode());
result;
}
String {
+ id + + name + ;
}
{
(, );
(, ());
System.out.println( + (p1 == p2));
System.out.println( + p1.equals(p2));
System.out.println( + p1.hashCode());
System.out.println( + p2.hashCode());
}
}

