HashMap的长度为什么是2的N次方

1.减小哈希冲突概率
假如当前Entry数组长度为len,插入节点时,需要对key的hashcode进行二次哈希,然后跟len-1相与(得到的值一定小于len,避免数组越界)
如果len是2的N次方,那么len-1的后N位二进制一定是全1

假设有两个key,他们的hashcode不同(假设hashcode长度大于len-1的长度),分别为code1和code2
code1和code2分别与一个后N位全1的二进制相与,结果一定也不同、
(hashcode长度小于len-1的长度时,该结论不成立。比如code1=1011 1011,code2=10001011,与length-1=01111进行与运算,得到的结果即数组下标是一样的,但是他们的hash值不同)

但是,如果code1和code2分别与一个后N位非全1的二进制相与,结果有可能相同

也就是说,如果len是2^N,不同hashcode的key计算出来的数组下标一定不同;
否则,不同hashcode的key计算出来的数组下标一定相同。

所以HashMap长度为全1,可以减小哈希冲突概率。

2.提高计算下标的效率
如果len的二进制后n位非全1,与len-1相与时,0与1相与需要取反。
如果len的二进制后n位全1,完全不需要取反。

如果len为2^N,那么与len-1相与,跟取余len等价,而与运算效率高于取余。
如果len不是2^N,与len-1相与,跟取余len不等价。

你可能感兴趣的:(java)