散列碼(hash code)是由對象導出的一個整數值。
散列碼沒有規律,兩個不同的對象x和y,x.hashCode()與y.hashCode()基本上不會相同。
1 public static void main(String[] args) { 2 String str1 = "HELLO WORLD!"; 3 String str2 = "hello world!"; 4 System.out.println(str1.hashCode()); 5 System.out.println(str2.hashCode()); 6 }
上面的代碼輸出兩個字符串的散列碼:
String 類中計算散列碼的源碼如下:
可以看出,字符串的散列碼是由內容導出的。
Object類是所有類的父類,hashCode()方法定義在Object類中,因此每一個類都有一個默認的計算對象散列碼的方法,
使用默認的方法計算對象的散列碼得到的值是對象的存儲地址。
如果在子類中重新定義equals()方法,必須重新定義hashCode()方法,如果x.equals(y)放回true,那么x.hashCode()就必須與y.hashCode()具有相同的值。
例如Student.equals()通過學生ID比較對象,那么hashCode()就需要基於ID生成散列碼。
hashCode()方法應該返回一個整數值(可以是負數),並合理地組合實體域的散列碼,以便讓各個不同的對象產生的散列碼分布的更加均勻。
一個比較好的生成方法是:
調用Objects.hash()方法,這個方法會對各個參數調用Objects.hashCode()方法,然后組合各個參數的散列值。