HashMap 的长度为什么是2的幂次方?

一、均匀分布哈希值 当 HashMap 的长度是 2 的幂次方时,通过 hashCode()计算出哈希值后,再与(length - 1)进行与操作(例如 index = hashCode() & (table.length - 1)),可以使得哈希值更加均匀地分布在数组的下标范围内。 假设哈希值是均匀分布的,那么与操作可以充分利用哈希值的各个位,将哈希值映射到不同的下标位置。例如,如果长度为 16(二进制为 10000),那么与操作会根据哈希值的低四位来确定下标,这样可以使不同的哈希值更有可能映射到不同的下标位置,减少哈希冲突。
因为hash值是不固定的,所以说key的hash值的二进制数任何位都可能是0或1,如果要保证减少hash碰撞,并且充分占据每个数组的位置,就必须要保证(数组大小-1)的二进制全是1,例如(16-1)的二进制是1111。这样的话,就能保证最后的运算结果,完全取决于hash的二进制数,也就是最后的结果会保证每个位都有可能是0或1。 对于十进制数而言,2的幂次方数-1的二进制数全都是1。

二、优化计算效率 与操作(&)比取模操作(%)效率更高
在计算下标时,如果长度是 2 的幂次方,那么与操作等价于取模操作,但与操作在计算机硬件层面上通常可以更快地执行。 取模操作可能涉及到除法和余数计算,相对比较耗时。而与操作只需要对二进制位进行简单的逻辑运算,执行速度更快。
三、便于扩容操作 当 HashMap 需要扩容时。
如果长度是 2 的幂次方,扩容后的新长度也是 2 的幂次方,并且只需要将旧的哈希值与新的长度减 1 进行与操作,就可以快速地重新计算元素在新数组中的位置。 这种方式可以避免复杂的重新哈希过程,提高扩容的效率。例如,从长度为 16 扩容到 32,旧的哈希值与 15(1111)进行与操作得到旧下标,新的哈希值与 31(11111)进行与操作得到新下标,这个过程相对简单高效。
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值