jvm中 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了,就會取不出來原先的數據。這個可以寫一個簡單的代碼自己驗證一下。
— 共有 2 條評論 —
方武卓: @xu4v 嗯,對mobile開發不瞭解,忽略了其他方面的情況,謝謝指正 2年前
xu4v: 未必是地址,主要取決於runtime library的實現,比如Android libcore就沒有直接用地址,而是在地址的基礎上hack一下 2年前

發佈了47 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章