1. 程式人生 > 實用技巧 >HashMap 位運算原理整理

HashMap 位運算原理整理

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