1. 程式人生 > >HashMap的預設長度為什麼是16?

HashMap的預設長度為什麼是16?

如果兩個元素不相同,但是hash函式的值相同,這兩個元素就是一個碰撞

因為把任意長度的字串變成固定長度的字串,所以存在一個hash對應多個字串的情況,所以碰撞必然存在

為了減少hash值的碰撞,需要實現一個儘量均勻分佈的hash函式,在HashMap中通過利用key的hashcode值,來進行位運算
公式:index = e.hash & (newCap - 1)

舉個例子:
1.計算"book"的hashcode
    十進位制 : 3029737
    二進位制 : 101110001110101110 1001

2.HashMap長度是預設的16,length - 1的結果
    十進位制 : 15
    二進位制 : 1111

3.把以上兩個結果做與運算
    101110001110101110 1001 & 1111 = 1001
    1001的十進位制 : 9,所以 index=9

hash演算法最終得到的index結果,取決於hashcode值的最後幾位

為了推斷HashMap的預設長度為什麼是16
現在,我們假設HashMap的長度是10,重複剛才的運算步驟:
hashcode : 101110001110101110 1001
length - 1 :                                     1001
index :                                            1001

再換一個hashcode 101110001110101110 1111 試試:
hashcode : 101110001110101110 1111
length - 1 :                                     1001
index :                                            1001

從結果可以看出,雖然hashcode變化了,但是運算的結果都是1001,也就是說,當HashMap長度為10的時候,有些index結果的出現機率
會更大而有些index結果永遠不會出現(比如0111),這樣就不符合hash均勻分佈的原則

反觀長度16或者其他2的冪,length - 1的值是所有二進位制位全為1,這種情況下,index的結果等同於hashcode後幾位的值
只要輸入的hashcode本身分佈均勻,hash演算法的結果就是均勻的

所以,HashMap的預設長度為16,是為了降低hash碰撞的機率
 

--------------------- 本文來自 易先生3729 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u010598360/article/details/79855105?utm_source=copy