首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java HashSet 移除自定義對象失敗的原因與 hashCode 實現規範

     編輯:程式設計綜合問答

現象重現

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 計算。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved