題目來源:微信公眾號「weknow619」。
package Jan2017;
import java.util.HashSet;
import java.util.Set;
public class Ques0104 {
public static void main(String[] args) {
Obj obj01 = new Obj("張三");
Obj obj02 = new Obj("李四");
Obj obj03 = new Obj("李四");
Set set = new HashSet<>();
set.add(obj01);
set.add(obj02);
set.add(obj03);
System.out.println(set.size());
}
}
class Obj {
private String id;
public Obj(String id) { this.id = id; }
@Override public int hashCode() { return 123; } // 固定返回值
@Override public boolean equals(Object obj) {
if (this == obj) return true;
if (obj instanceof Obj && this.id.equals(((Obj) obj).id)) return true;
return false;
}
}
2
hashCode() 恆返回 123,導致所有對象落入同一哈希桶,HashSet 退化為鏈表/紅黑樹查找。obj01("張三"):桶為空,直接插入 → size=1。obj02("李四"):同桶,遍歷調用 equals,與 obj01 比較 id 不同 → 插入 → size=2。obj03("李四"):同桶,先比較 obj01 (id不同) → 再比較 obj02 (id相同) → equals 返回 true → 判定重複,不插入 → size 仍為 2。「如果兩個對象equals()返回true,則它們的hashCode()必須相等。」
反向不要求:hashCode 相等不代表 equals 為真(哈希碰撞)。
equals 必須重寫 hashCode,且包含相同字段。Objects.hash(field1, field2...) (JDK 7+)。