为什么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来决定,还和表的容量有很大关系,增大了哈希碰撞的概率。

posted @ 2020-10-07 20:06  mbcwdl  阅读(30)  评论(0)    收藏  举报