1.hashmap在確定元素落在陣列的位置的時候,計算方法是(n - 1) & hash,n為陣列長度也就是初始容量 ,這是因為「取模」運算的消耗還是比較大的,那麼如何保證(n - 1) & hash和hash%n的結果相同呢,當n為2的指數次冪時,會滿足乙個公式:(n - 1) & hash = hash % n,這樣就可以用(n - 1) & hash的位運算來使計算更加高效。
2.如果初始容量是奇數,那麼(n-1)就為偶數,偶數2進製的結尾都是0,經過hash值&運算後末尾都是0,那麼0001,0011,0101,1001,1011,0111,1101這幾個位置永遠都不能存放元素了,空間浪費相當大,更糟的是這種情況中,陣列可以使用的位置比陣列長度小了很多,這樣就會造成空間的浪費而且會增加hash衝突。
3. 只有是2的指數次冪的數字經過n-1之後,二進位制肯定是 ...11111111 這樣的格式,這種格式計算的位置的時候,完全是由產生的hash值類決定,而不受n-1 影響。這樣會提高效率。比如要擴容了,2的冪次方*2,在二進位制中比如4和8,代表2的2次方和3次方,他們的2進製結構相 似,比如 4和8 00000100 0000 1000 只是高位向前移了一位,這樣擴容的時候,只需要判斷高位hash,移動到之前位置的倍數就可以了,免去了重新計算位置的運算。並且這樣可以保證(n - 1) & hash得到的儲存位置是在hashmap的length之內的,也就是n之內。因為最大也就是hash值也全是...1111111
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的冪次方
hashmap初始容量為什麼是2的冪次方?hashmap中的資料結構是陣列 單鏈表的組合,我們希望元素存放的更均勻,最理想的效果是entry陣列中每個位置都只有乙個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較key,而且空間利用率最大。那麼如何計算才會分布最均勻呢...