HashMap為什麼是初始容量是16

2021-10-21 07:13:57 字數 1118 閱讀 3771

為了讓大家一眼明白。

index = hashcode(key) & (length- 1)

如何進行位運算呢?有如下的公式(length是hashmap的長度):

index = hashcode(key) & (length- 1)

下面我們以值為「book」的key來演示整個過程:

1.計算book的hashcode,結果為十進位制的3029737,二進位制的101110001110101110 1001。

2.假定hashmap長度是預設的16,計算length-1的結果為十進位制的15,二進位制的1111。

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

可以說,hash演算法最終得到的index結果,完全取決於key的hashcode值的最後幾位

hash演算法均勻分布

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

因為2的冪次方擁有更低的碰撞機率和更高的查詢速率。這才是他想考你的吧。

雜湊函式的設計就是圍繞減少雜湊碰撞和使元素分布均勻(整個陣列都能存放)而設計的。

hashmap就是乙個插入慢、查詢快的資料結構

1、如果空間利用率高,那麼經過雜湊計算後,發現很多位置滿了

2、為了避免雜湊衝突,增加陣列容量,就會導致空間利用率不高。

載入因子,就是hash表中,元素的填滿程度。

載入因子 = 填入表中的元素個數 / 雜湊表的長度

衝突的機會」與「空間利用率」之間,尋找一種平衡與折衷

HashMap初始容量為什麼是16

這裡不講 只講思路。要稍微懂點二進位制。hashmap的結構是陣列加鍊表,容量指的是陣列長度。元素放入陣列的哪個位置?這由算出來的hashcode 跟 1111 作與運算 得出陣列下標。hashcode具體演算法我也不知道 為什麼是1111,因為0000 1111共16個數,跟陣列下標 容量都一致。...

HashMap初始容量為什麼是2的冪次方

hashmap初始容量為什麼是2的冪次方?hashmap中的資料結構是陣列 單鏈表的組合,我們希望元素存放的更均勻,最理想的效果是entry陣列中每個位置都只有乙個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較key,而且空間利用率最大。那麼如何計算才會分布最均勻呢...

hashmap為什麼初始容量是2的指數冪

1.hashmap在確定元素落在陣列的位置的時候,計算方法是 n 1 hash,n為陣列長度也就是初始容量 這是因為 取模 運算的消耗還是比較大的,那麼如何保證 n 1 hash和hash n的結果相同呢,當n為2的指數次冪時,會滿足乙個公式 n 1 hash hash n,這樣就可以用 n 1 h...