理解 (n - 1) & hash
在HashMap
中存值的时候需要计算位置,具体的算法为 (n - 1) & hash
为什么不使用 hash % n
呢
我们来简单理解一下
n
是map的容量,等于2
的幂
例如:
100 / 8 = 12
100 % 8 = 4
如果使用二进制的位运算的话,除以8[2 ^ 3]
就是向右移了3位
0110 0100 >> 3 = 0000 1100[100]
0000 1100 = 12 就是商
100 = 4 就是余数
也就是0110 0100的后3位:100
想一下,hash除以n = 2 ^ m
,就是hash值的二进制数向右移动了m位,而余数就是hash的后m
位
除以8,向右移动3位;除以16,向右移动4位;除以32,向右移动5位 …
那么怎样快捷把这几位表示出来呢
我们首先就想到的是使用 &
符号,有几位余数,我们就使用几个1
例如:
三位余数:100 & 111 = 100
四位余数:1100 & 1111 = 1100
五位余数: 11100 & 11111 = 11100
那么到这里,就解决了一半
但是在计算 hash % n
的时候怎么构造这m个1呢
n = 2 ^ m
n是10000的形式
例如:
8 = 1000 = 2 ^ 3
16 = 10000 = 2 ^ 4
32 = 100000 = 2 ^ 5
发现了吗,n表示成2进制的位数是 m + 1
而n - 1刚好就是m位,而且全都是1,完美解决
8 - 1 = 111
16 - 1 = 1111
32 - 1 = 11111
综合看来 hash % n = hash & (n -1)
而后者是使用二进制的逻辑运算,底层运算,效率肯定会高很多
持续更新 -_-