hashmap初始容量為什麼是2的冪次方?
hashmap中的資料結構是陣列+單鏈表的組合,我們希望元素存放的更均勻,最理想的效果是entry陣列中每個位置都只有乙個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較key,而且空間利用率最大。那麼如何計算才會分布最均勻呢?我們首先想到的就是%運算,雜湊值%容量=bucketindex,我們來看原始碼
static int indexfor(int h,int length)
h是通過k的hashcode最終計算出來的雜湊值,並不是hashcode本身,而是hashcode之上又經過一層運算的hash值,length是目前容量。當容量是2^n時,h & (length -1) == h % length。
這個等式實際上可以推理出來,2^n轉換成二進位制就是1+n個0,減1之後就是0+n個1,如16 -> 10000,15 -> 01111,那根據&位運算的規則,都為1(真)時,才為1,那0≤15運算後的結果≤15,假設h <= 15,那麼運算後的結果就是h本身,h >15,運算後的結果就是最後三位二進位製做&運算後的值,最終,就是%運算後的餘數。
HashMap初始容量為什麼是16
這裡不講 只講思路。要稍微懂點二進位制。hashmap的結構是陣列加鍊表,容量指的是陣列長度。元素放入陣列的哪個位置?這由算出來的hashcode 跟 1111 作與運算 得出陣列下標。hashcode具體演算法我也不知道 為什麼是1111,因為0000 1111共16個數,跟陣列下標 容量都一致。...
HashMap為什麼是初始容量是16
為了讓大家一眼明白。index hashcode key length 1 如何進行位運算呢?有如下的公式 length是hashmap的長度 index hashcode key length 1 下面我們以值為 book 的key來演示整個過程 1.計算book的hashcode,結果為十進位制...
hashmap為什麼初始容量是2的指數冪
1.hashmap在確定元素落在陣列的位置的時候,計算方法是 n 1 hash,n為陣列長度也就是初始容量 這是因為 取模 運算的消耗還是比較大的,那麼如何保證 n 1 hash和hash n的結果相同呢,當n為2的指數次冪時,會滿足乙個公式 n 1 hash hash n,這樣就可以用 n 1 h...