1. 程式人生 > >JAVA 兩個物件不同為什麼他們的hashcode有可能相同

JAVA 兩個物件不同為什麼他們的hashcode有可能相同

       hashCode是所有java物件的固有方法,如果不過載的話,返回的實際上是該物件在jvm的堆上的記憶體地址,而不同物件的記憶體地址肯定不同,所以這個hashCode也就肯定不同了。如果過載了的話,由於採用的演算法的問題,有可能導致兩個不同物件的hashCode相同。

而且,還需要注意一下兩點:

1)hashCode和equals兩個方法是有語義關聯的,它們需要滿足:

A.equals(B)==true --> A.hashCode()==B.hashCode()

因此過載其中一個方法時也需要將另一個也過載。

2)hashCode的過載實現需要滿足不變性,即一個object的hashCode不能前一會是1,過一會就變成2了。hashCode的過載實現最好依賴於物件中的final屬性,從而在物件初始化構造後就不再變化。一方面是jvm便於程式碼優化,可以快取這個hashCode;另一方面,在使用hashMap或hashSet的場景中,如果使用的key的hashCode會變化,將會導致bug,比如放進去時key.hashCode()=1,等到要取出來時key.hashCode()=2了,就會取不出來原先的資料。這個可以寫一個簡單的程式碼自己驗證一下。

      雜湊表是結合了直接定址和鏈式定址兩種方式,所需要的就是將需要加入雜湊表的資料首先計算雜湊值,其實就是預先分個組,然後再將資料掛到分組後的連結串列後面,隨著新增的資料越來越多,分組鏈上會掛接更多的資料,同一個分組鏈上的資料必定具有相同的雜湊值,java中的hash函式返回的是int型別的,也就是說,最多允許存在2^32個分組,也是有限的,所以出現相同的雜湊碼就不稀奇了