這裡不講**,只講思路。要稍微懂點二進位制。
hashmap的結構是陣列加鍊表,容量指的是陣列長度。
元素放入陣列的哪個位置?這由算出來的hashcode 跟 1111 作與運算(&)得出陣列下標。
hashcode具體演算法我也不知道
為什麼是1111,因為0000~1111共16個數,跟陣列下標、容量都一致。可以說存放到哪個位置,完全由hashcode右邊四位決定。
hashmap盡可能做到元素在陣列中均勻分布。
如果容量是10,hashcode就要跟1001做與運算,結果二進位制下hashcode的右邊四位數如果是1001,1011,1101,1111,算出來結果都是1xx1 & 1001 = 1001,都會落在陣列第9位。有些結果也永遠不會出現,如1111 ,即陣列15位永遠不會有東西。
擴容時是翻倍,其實是16 變成32,二進位制中對應11111,演算法跟以上類似。
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...