1.结论
很简单,就是为了提高效率。
注:这里2^n是2的n次方,不是异或符号。
因为位运算肯定比更快。所以&比%更快。那和这个2的n次方有什么关系呢?
其实如果长度为2^n,在HashMap进行hash运算时并不是直接算hash%length,而是将其等价为hash&(length-1),位运算肯定是比取模运算效率高的多。
2.证明
那这个公式:hash%length==hash&(length-1),咋证明呢?
如果hash = 21, length = 8,显然 hash % length = 5。然后21的二进制为10101, 8 - 1的二进制为00111,我们可以发现这个21&7其实就可以发现就是取21二进制的后三位,也是5。
同理,任何一个数对2^n取模,也就是对2^n-1取模。实际上利用率2^n-1二进制全是1的特点。