Java中的HashMap在设计时选择以2的幂次方来扩大容量,这是出于性能和效率方面的考虑。
1.提高运算速度
在HashMap中,元素的位置是通过计算其键的哈希码并将其映射到内部数组的一个索引来确定的。这个索引计算公式通常为:index = hash(key)&(capacity - 1)
capacity是HashMap的容量大小。这个公式利用了位运算中的按位与操作来计算索引,而不是取模运算(%),因为位运算通常更快。
当capacty是2的幂次方时,(capacity - 1)就是一个只有低位为1,其余位为0的数。在这种情况下,hash(key) & (capacty - 1)的效果等价于hash(key) %capacity,但前者更快,因为按位与操作在现代处理器上通常比取模运算要快得多。
- 补充:
按位与运算: 如果有0则为0,都为1时则输出为1
HashMap默认容量为16,那么在存放到数组时就是n-1也就是15,而15二进制则是1111扩容后为32-1,即11111111,如果都为1的情况下是可以极大的减少hash碰撞,增加效率的
2.减少哈希碰撞
当HashMap的容量是2的幂次方时,哈希值的分布更加均匀,这有助于减少哈希碰撞的发生。
哈希碰撞是指不同的键映射到了同一个数组索引上。虽然不能完全避免哈希碰撞是,但可以通过合理选择容量大小可以最小化这种情况。
3.便于调整大小
当HashMap需要扩容时,新的容量也是2的幂次方,这使得旧的哈希值在新的容量下重新计算索引时,可以更好地分散到更大的数组中,从而进一步降低哈希碰撞的概率。