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