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個分組,也是有限的,所以出現相同的哈希碼就不稀奇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM