第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于HashMap源碼中hash(Object key)方法原理問題

關于HashMap源碼中hash(Object key)方法原理問題

陪伴而非守候 2019-03-14 18:15:03
在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é):

https://img1.sycdn.imooc.com//5cbd24bd0001a88d07440694.jpg

應該對你理解有幫助


查看完整回答
反對 回復 2019-04-22
?
蠱毒傳說

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 ,并不是均勻的概念,希望這樣說樓主能理解

查看完整回答
反對 回復 2019-04-22
  • 3 回答
  • 0 關注
  • 877 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號