在HashMap源碼中,hash(Object key)方法的代碼如下:static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}我的問題是為什么不直接使用key.hashCode()拿到哈希值,反而在后面追加 ^ (h >>> 16)處理,為什么要這么做以及能帶來什么好處?謝謝!
3 回答

紅顏莎娜
TA貢獻1842條經驗 獲得超13個贊
可以看看這篇文章,專門講HashMap
的,How does a HashMap work in JAVA
關于你看到的實現(xiàn),是java8
的版本,之前不是這個樣子的。
還是上面那篇文章,注意下面章節(jié):
應該對你理解有幫助

蠱毒傳說
TA貢獻1895條經驗 獲得超3個贊
樓上貼出來的截圖其實是解釋了為什么hashmap要采用2的n次方的數(shù)量級的長度作為數(shù)組的長度,答案是因為hashmap需要用length-1的數(shù)量級和hash值做一個與操作,如果長度是17,那么length-1就是16那么與下來的值要么是0要么是16,也就是說16個槽子只用了兩個槽,效率是很低的,而如果采用16(2的四次方),就是15(01111)做與操作,均勻分不到0-15的槽子上
回到樓主的問題,為什么hash值要做 (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)這個計算?我們知道hash的目的是為了希望能夠盡量均勻,最后做indexFor的時候實際上只是利用了低16位,高16位是用不到的,那么低16位的數(shù)字如何保證均勻?即使利用^亦或的方法,因為&和|都會使得結果偏向0或者1 ,并不是均勻的概念,希望這樣說樓主能理解
添加回答
舉報
0/150
提交
取消