从网上学一下HashMap扩容为什么是2的倍数
1.7查询放的索引值
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
1.8 resize值放入的里面涉及到了h & (length-1);逻辑
newTab[e.hash & (newCap - 1)] = e;
1.8 put 涉及到的逻辑
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
根据参考的逻辑
(n - 1) & hash = hash % n 主要是取代%去取模才是使用2的倍数的原因,&比%快很多
且当是2的倍数时,length-1的二进位是
当是16时,15的二进位是1111
当是32位时,31的二进位是11111
确保最后的数字统一为1,
当&的时候减少碰撞
15索引位置为15
如果将末尾的一个数字改成0
1111->1110
则15和14的索引位置在14上面
冲突的概率会加大