Hashmap的容量為什麼是2的冪次

2021-08-09 09:03:46 字數 689 閱讀 2106

做為面試常考的問題之一,每次都答的模模糊糊,有必要了解一下,首先來看一下hashmap的put方法的原始碼

public v put(k key, v value) 

}modcount++;

addentry(hash, key, value, i);//增加乙個新的entry到table[i]

return null;//如果沒有與傳入的key相等的entry,就返回null

}

/**

* "按位與"來獲取陣列下標

*/static int indexfor(int h, int length)

hashmap始終將自己的桶保持在2的n次方,這是為什麼?indexfor這個方法解釋了這個問題

大家都知道計算機裡面位運算是基本運算,位運算的效率是遠遠高於取餘%運算的

舉個例子:

2^n轉換成二進位制就是1+n個0,減1之後就是0+n個1,如16 -> 10000,15 -> 01111

那麼根據&位運算的規則,都為1(真)時,才為1,那0≤運算後的結果≤15,假設h <= 15,那麼運算後的結果就是h本身,h >15,運算後的結果就是最後四位二進位製做&運算後的值,最終,就是%運算後的餘數。

當容量一定是2^n時,h & (length - 1) == h % length

HashMap為什麼是初始容量是16

為了讓大家一眼明白。index hashcode key length 1 如何進行位運算呢?有如下的公式 length是hashmap的長度 index hashcode key length 1 下面我們以值為 book 的key來演示整個過程 1.計算book的hashcode,結果為十進位制...

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...