HashMap的大小为什么必须是 2 的倍数
为了加快哈希计算以及减少哈希冲突
一、加快哈希计算
我们为了找到 key 的位置在哈希表的那个槽中,需要计算 hash(key) % 数组长度
。而 HashMap 一般使用 hash值 & (数组大小-1)
。 2 的倍数意味着该数的二进制位只有一位为 1,而该数 -1 就可以得到二进制位上 1 变成 0,后面的 0 变成 1,再通过 & 运算,就可以达到和 % 一样的效果,并且位运算比 % 的效率高很多。
二、减少哈希冲突
当 length 为偶数时,length-1 为奇数,奇数的二进制最后一位是 1,这样便保证了 hash & (length -1)
的最后一位可能为 0,也可能为 1,即 & 运算后的结果可能为偶数,也可能为奇数,这样便可以保证哈希的均匀性
如果 length 为奇数时,很明显 length-1 为偶数,它的最后一位是 0,这样 hash & (length-1)
的最后一位肯定为 0,即只能为偶数,这样任何 hash 值都只会被哈希到数组的偶数下标位置上,这便浪费了近一半的空间
因此,length 取 2 的整数次幂,是为了使不同 hash 值发送碰撞的概率变小,这样就能使元素在哈希表中均匀的哈希。