為了讓大家一眼明白。
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...