jdk8 hashmap中根據hashcode獲得索引操作

HashMap源碼部分截取:

  • 取hash操作如下圖所示

在這裏插入圖片描述

  • put操作如下

在這裏插入圖片描述

  • 第二幅圖爲什麼使用(n - 1) & hash = key在數組中的索引
    對於創建hashmap時,他的size一定是2^n次方個,有興趣的可以看一下hashmap的tableSizeFor方法,這就不做闡述!這裏&運算有點類似於對數組進行取模運算.因爲n爲2的n次方,他的二進制是1後面+0,如果減一之後就變爲全部爲1,比如n=16的二進制10000,15的二進制1111,&與操作是見0就是0,因此如果用16&,不管hash值爲多少後面4爲全部都是0,這樣跟hash表較少出現hash碰撞是相違背的,因爲採用n-1的方式&,這樣在保證索引永遠不大於n-1的同時,因爲hash的隨機也保證了數據均勻的散列在hash表裏

  • 第一幅圖h = key.hashCode() hashcode如何保證唯一呢?
    因爲返回的是對象在堆中的存儲地址,所以可以保證唯一性!
    ps補充:

hashcode本身是個32位int整型值,在系統中,這個值對於不同的對象必須保證唯一(JAVA規範),這也是大家常說的,重寫equals必須重寫hashcode的重要原因。

  • 第一幅圖h >>> 16爲什麼要無符號右移16位呢
    因爲不同對象的hashcode值是不同的(參照上個問題保證唯一性),轉化爲2進制有些hashcode位數會非常的高,如果僅僅使用低位的hashcode就會出現較多的hash碰撞,hashcode值無符號右移16位就可以得到較高位數的hashcode值,因而設計者這裏^一個h>>>16, ^異或運算是同樣則爲0,不同則爲1.此處比較合適,因爲如果用&會偏向於0多一些,用|會偏向於1多一些.

如果有不對的,歡迎指正和討論!!!共同學習!共同進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章