a.equals(b) == true ⇒ a.hashCode() == b.hashCode()hashCode 相等 ⇏ equals 相等(哈希碰撞)key.hashCode() 確定桶索引 (n-1) & hashequals 比較hashCode,邏輯相等對象落入不同桶,**導致無法查找、重複插入**class Bad {
String name;
@Override public boolean equals(Object o) {
return o instanceof Bad && name.equals(((Bad)o).name);
}
// 缺失 hashCode → 繼承 Object.identityHashCode()
}
Set set = new HashSet<>();
set.add(new Bad("A"));
set.add(new Bad("A")); // 邏輯相等,但 hashCode 不同
System.out.println(set.size()); // 輸出 2!違反 Set 語義
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person p = (Person) o;
return Objects.equals(name, p.name) && age == p.age;
}
@Override
public int hashCode() {
return Objects.hash(name, age); // JDK 7+ 推薦
// 手動實現:31 * name.hashCode() + age
}
Alt+Insert → equals() and hashCode()@EqualsAndHashCode 自動生成Objects.hashCode()、MoreObjects.toStringHelper()若類不可變,hashCode 可緩存(如 String),提升性能;作為 Map Key/Set 元素安全可靠。
Objects.hash 或 IDE 生成