为什么HashMap的容量要是2的n次幂
1. 为什么哈希表的容量要是2的n次幂
HashMap在进行put(key,value)的时候,会首先根据key计算出一个哈希值,然后和n-1进行与运算(hash & n-1)。为了减少哈希碰撞的出现,将表的容量置为2的n次幂是合理的。
当n为2的n次幂
hashmap初始容量为16,-1后的二进制为0000 1111。此时key1和key2的hash值分别为0101 0101和 0001 1001

可以看到,&运算的结果完全是由hash的后4位决定的。接着看
当n不为2的n次幂
假设此时表容量为17,-1后的二进制0001 0000

&运算的结果相同,发生了哈希碰撞,此时&运算的结果仅由0001 0000 中的1这一位决定。这时候发生哈希碰撞的概率明显要高于n为2的次幂的情况下。
这时候我们就可以发现,当表容量为2的n次幂时,-1后和hash做与运算 相当于直接截掉hash的后几位作为运算结果,此时的运算结果完全由hash来决定。而如果表容量不是2的n次幂,-1后和hash做与运算,结果不仅仅由hash来决定,还和表的容量有很大关系,增大了哈希碰撞的概率。

浙公网安备 33010602011771号