基于jdk1.8的HashMap源碼分析(二)

? ? 再上次看了hashMap的put方法棺禾,了解了大概的流程锐借,今天再來搞搞put中的hash(key) 方法和具體計算下標的方法

1

?? ?源碼是這樣的?

static final int hash(Object key) {

int h;

return (key ==null) ?0 : (h = key.hashCode()) ^ (h >>>16);

}

相當于 ?h^h>>>16

先來了解一下這幾個運算符

????1.與運算符

????????與運算符用符號“&”表示障本,其使用規(guī)律如下:

????????兩個操作數中位都為1棋电,結果才為1栗涂,否則結果為0,

????????例如 1111 & 1110 ?結果為 1110?

????????此種運算中 得到0的概率是0.25 得到1的概率是0.75????

????2.非運算符

????????非運算符用符號“|”表示胀滚,其使用規(guī)律如下:

????????兩個位只要有一個為1趟济,那么結果就是1,否則就為0

????????例如 1111 & 1110 ?結果為 1111

????????此種運算中 得到0的概率是0.75 得到1的概率是0.25

????3.異或運算符

????????異或運算符是用符號“^”表示的咽笼,其運算規(guī)律是:

????????兩個操作數的位中顷编,相同則結果為0,不同則結果為1剑刑。

????????例如 1111 & 1110 ?結果為 0001

????????此種運算中 得到0和1的概率都是0.5?

????????接下來看h>>>16?

????????源碼中有這樣一個常量

????????static final int DEFAULT_INITIAL_CAPACITY =1 <<4;// aka 16

????????1 <<4代表 1*2的4次方

????????>>> ?則代表 無符號右移媳纬,忽略符號位,空位都以0補齊

????????h>>>16 則代表右移16位 即當key的hashCode值小于2的16次方時 h>>>16都為0

????????h^h>>>16 就是高16位和低16位的異或運算 保證hash散列的平均分布

2.計算下標

????if ((p = tab[i = (n -1) & hash]) ==null)

????????tab[i] = newNode(hash, key, value,null);

? ? tab[I =(n-1)&hash]?

? ? 此處關注的重點在于為何hashMap的初始化長度是2的4次方 以及resize()每次都是擴容為原來長度的2倍

? ? (1)我們知道 偶數的二進制最后一位是0 奇數的二進制最后一位是1 施掏,當(n-1)和hash進行&運算的時候钮惠, hash的最后一位不確定, &運算只有當都為1?七芭,結果才為1素挽,否則結果為0。那么狸驳,如果(n-1)是偶數 計算出來的值最后一位肯定為0 必然會導致我們只能使用數組長度的一半 導致資源的浪費预明,產生大量的hash沖突。而(n-1)為奇數 則會避免這個問題

????(2)還有一種說法是 當length為偶數時 可以用&代替%運算 效率高?

? ? ? ? ? ? 這點我還沒想明白 后面有時間再補充吧

? ? ? ? ? ?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末耙箍,一起剝皮案震驚了整個濱河市撰糠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辩昆,老刑警劉巖阅酪,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡术辐,警方通過查閱死者的電腦和手機砚尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辉词,“玉大人尉辑,你說我怎么就攤上這事〗嫌欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵卓练,是天一觀的道長隘蝎。 經常有香客問我,道長襟企,這世上最難降的妖魔是什么嘱么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮顽悼,結果婚禮上曼振,老公的妹妹穿的比我還像新娘。我一直安慰自己蔚龙,他們只是感情好冰评,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著木羹,像睡著了一般甲雅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坑填,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天抛人,我揣著相機與錄音,去河邊找鬼脐瑰。 笑死妖枚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的苍在。 我是一名探鬼主播绝页,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忌穿!你這毒婦竟也來了抒寂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掠剑,失蹤者是張志新(化名)和其女友劉穎屈芜,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡井佑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年属铁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躬翁。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡焦蘑,死狀恐怖,靈堂內的尸體忽然破棺而出盒发,到底是詐尸還是另有隱情例嘱,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布宁舰,位于F島的核電站拼卵,受9級特大地震影響,放射性物質發(fā)生泄漏蛮艰。R本人自食惡果不足惜腋腮,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壤蚜。 院中可真熱鬧即寡,春花似錦、人聲如沸袜刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽水泉。三九已至善涨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間草则,已是汗流浹背钢拧。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炕横,地道東北人源内。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像份殿,于是被迫代替她去往敵國和親膜钓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • 轉載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,154評論 1 5
  • 一卿嘲、HashMap概述 HashMap基于哈希表的Map接口的實現(xiàn)颂斜。此實現(xiàn)提供所有可選的映射操作,并允許使用nul...
    小陳阿飛閱讀 637評論 0 2
  • 最近粗粗看了prssone的白皮書拾枣,覺得還是充滿了野心和想象力沃疮。項目意圖解決現(xiàn)在網絡內容的確權和如何防止侵權的問題...
    零壹生活閱讀 569評論 0 13
  • 孫麗 焦點網絡初級十期 息縣堅持分享第72天 今天是母親節(jié)盒让,首先祝全天下的母親永遠幸福安康。 早晨司蔬,送昨天留宿的侄...
    孫麗_cdb3閱讀 260評論 0 0
  • #每日一問#14/31 有什么習慣是你堅持至今的邑茄?它給你的人生帶來了什么樣的變化? 序號俊啼、群序號—群名稱肺缕,堅持的習...
    虔一閱讀 162評論 0 0