首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java hashCode() 契約速懂:equals 相等必須 hashCode 相等

     編輯:Java 程式設計入門

核心規範

若 a.equals(b) == true,則 a.hashCode() == b.hashCode() 必須成立。
反之不要求:hashCode 相等不代表 equals 相等(哈希碰撞)。

驗證代碼

public class HashCodeDemo {
    public static void main(String[] args) {
        String s1 = "aaa";
        String s2 = s1;           // 同一引用
        String s3 = "bbb";        // 不同內容

        System.out.println(s1.equals(s2));  // true
        System.out.println("s1.hashCode() = " + s1.hashCode()); // 96321
        System.out.println("s2.hashCode() = " + s2.hashCode()); // 96321
        System.out.println("s3.hashCode() = " + s3.hashCode()); // 97314
    }
}

輸出解讀

true
s1.hashCode() = 96321
s2.hashCode() = 96321
s3.hashCode() = 97314
  • s1 與 s2 指向同一對象,equals 為 true,hashCode 當然相同。
  • s3 內容不同,hashCode 也不同(極小概率碰撞除外)。

實戰啟示

  • 重寫 equals() 時 必須 重寫 hashCode(),否則作為 HashMap Key 或 HashSet 元素會出現「明明放進去了卻取不出」的 Bug。
  • IDE 一鍵生成 equals/hashCode 時,會基於相同字段計算,保證契約。
  • String 的 hashCode() 算法:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1],JDK 內部緩存結果(hash 字段),二次調用極快。

常見錯誤示例

// 錯誤:只重寫 equals,不重寫 hashCode
class BadKey {
    String id;
    @Override public boolean equals(Object o) {
        return o instanceof BadKey && id.equals(((BadKey)o).id);
    }
    // 缺少 hashCode() → 繼承 Object.hashCode()(基於內存地址)
}
// 結果:new BadKey("1") 和 new BadKey("1") 放入 HashMap 會被視為不同 Key
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved