Set set = new HashSet();
set.add(new Name("f1","l1"));
set.remove(new Name("f1","l1")); // 返回 false,未移除
HashSet 依賴 hashCode() 定位桶位,再用 equals() 比較。代碼中 Name 類雖重寫 equals(),但 hashCode() 僅使用 firstName.hashCode(),導致兩個 new Name("f1","l1") 實例的 hashCode 可能不同(若 firstName 相同則相同,但未包含 lastName,違反 equals 一致性契約)。
@Override
public int hashCode() {
return Objects.hash(firstName, lastName); // 或 31 * firstName.hashCode() + lastName.hashCode()
}
原則:equals 為 true 的對象,hashCode 必須相等;參與 equals 比較的所有字段都應參與 hashCode 計算。