HashMap 位運算原理整理
阿新 • • 發佈:2021-01-19
hash計算公式: h ^ (h >>> 16)
h 為 Java native 計算得出的hash值,int型別32位
假如 h 值如下:
h dec: 2026691355
h bin: 01111000110011001101101100011011
h 無符號右移(>>>)16位結果:
bin: 00000000000000000111100011001100
dec: 30924
hash異或(^)30924
結果:
01111000110011001101101100011011
00000000000000000111100011001100
--------------------------------
01111000110011001010001111010111
高16位沒變,第16跟高16位異或,最終計算得:
bin: 01111000110011001010001111010111
dec: 2026677207
計算陣列下角標公式:(n - 1) & hash
n 為陣列長度,假如當前長度為 128
(128 - 1) & 2026677207
128 - 1 結果:
dec: 127
bin: 1111111
與運算:
00000000000000000000000001111111
01111000110011001010001111010111
--------------------------------
00000000000000000000000001010111
結果:
dec: 87
bin: 00000000000000000000000001010111
因為陣列長度 n 為 2的冪次方,所以所有 n -1 的二進位制值為:低位指數m個1高位補零
比如上方陣列長度為128,為2的7次方。 128-1 為 127 用二進位制值表示必定為低位7個1高位補零:
00000000000000000000000001111111
而任何數與 00000000000000000000000001111111
進行與運算的計算結果必定在 00000000000000000000000001111111
範圍內(因為高位都是0低位都是1與其與運算得出的結果高位仍然還是0),所以計算得出的陣列下標必定不會超過陣列長度(類似與取模運算)。
擴容兩倍:newCap = oldCap << 1
左移一位就相當於 oldCap * 2