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

Java HashMap containsKey 失效:自定義 Key 必須重寫 equals 與 hashCode

     編輯:程式設計綜合問答

現象

HashMap map = new HashMap<>();
Test t1 = new Test(0,1,0,0,0);
Test t2 = new Test(0,1,0,0,0);
map.put(t1, null);
map.containsKey(t2); // 返回 false,預期 true

根因

`Test` 類未重寫 `equals()` 和 `hashCode()`,繼承自 `Object` 的預設實現:**比較記憶體地址(引用相等)**。`t1` 和 `t2` 是兩個不同實例,故 `containsKey` 判定為不同 Key。

修正:重寫 equals 與 hashCode

class Test {
    public int a, b, c, d, e;
    public Test(int a,int b,int c,int d,int e){ this.a=a; this.b=b; this.c=c; this.d=d; this.e=e; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Test)) return false;
        Test t = (Test) o;
        return a==t.a && b==t.b && c==t.c && d==t.d && e==t.e;
    }

    @Override
    public int hashCode() {
        int result = a;
        result = 31*result + b;
        result = 31*result + c;
        result = 31*result + d;
        result = 31*result + e;
        return result;
    }
}

工具提示

  • IDE 一鍵生成:Alt+Insert → equals() and hashCode()。
  • Lombok:`@Data` 或 `@EqualsAndHashCode` 自動生成。
  • Google Guava:`Objects.equal(a,b)` / `Objects.hashCode(...)` 輔助手寫。

核心法則

作為 HashMap Key、HashSet 元素的類,必須同時正確重寫 `equals()` 和 `hashCode()`,且依賴的欄位必須不可變。

修正後 `containsKey(t2)` 將正確返回 `true`。

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