public class HashTest {
private int i;
public int hashCode() { return i % 10; } // 故意製造碰撞
// 未重寫 equals() → 使用 Object 默認引用比較
public static void main(String[] args) {
HashTest a = new HashTest(); a.setI(1);
HashTest b = new HashTest(); b.setI(1);
Set<HashTest> set = new HashSet<>();
set.add(a); set.add(b);
System.out.println(a.hashCode() == b.hashCode()); // true
System.out.println(a.equals(b)); // false
System.out.println(set); // [HashTest@1, HashTest@1] ← 重複對象!
}
}
後果:同桶不同對象,HashSet 失去去重功能。
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
HashTest other = (HashTest) obj;
return this.i == other.i; // 業務鍵一致即視為相等
}
@Override
public int hashCode() {
return i % 10; // 必須使用與 equals 相同的業務字段
}
結果:true true [HashTest@1] 僅保留一個對象。
Objects.hash(field1, field2))「兩個對象 hashCode 相等就說明它們相等」→ 錯誤,只是落在同一桶,還需 equals 進一步比較。