直接说原因:
- 计算方便
- hash分布更均匀
计算方便
当HashMap长度为2的次方时,等式 hash(key) & (length - 1) == hash(key) % length 成立
解释:
hash(key) % length 得到的结果 hash(key) - (hash(key) / length) * length
因为HashMap长度为2的次方,所以length - 1 的值转成二进制为全1的形式(2的次方一定是 1000…… 这种形式,再减去1,剩下的一定都是1,没有0),hash(key) & (length - 1) 结果是和hash(key) % length 等价的
hash分布更均匀
先解释一下hash均匀的含义:hashmap调用put方法,根据key通过hash函数计算的到table数组的下标,理想情况是table数组可以充分被利用,即hash均匀
计算table数组下标的方式为: hash(key) & (length - 1)
& 运算有个特点,如果一个数的某一位为0,那么结果的对应位也为0
num1: 1111
num2: 1101
result: 1101
所以只有当length - 1为全 1时,才不会出现上述情况。
参考博客:https://juejin.cn/post/6844903813896224775
https://blog.csdn.net/zjcjava/article/details/78495416