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

posted @ 2021-01-19 17:15  无用郎中  阅读(239)  评论(0编辑  收藏  举报