为什么 hashMap 中长度必须是 2 的 n 次方幂?

底层计算数组 index 的算法(实际就相当于 hash % n 运算,但是 % 运算对于计算机来说效率低,如果不考虑性能采用 % 运算,就不用考虑是 2 的 n 次方幂):(n - 1) & hash = index ,n 表示数组的长度

经过测试可以减少 hash 冲突,均匀分配数组空间。

举个例子:

hash:2     n:8(2的3次方)

计算公式: hash&(n - 1)

2 &(8-1)

0000 0010 2

0000 0111 7

——————————

0000 0010 2 索引

hash:3     n:8(2的3次方)

计算公式: hash&(n - 1)

3 &(8-1)

0000 0011 3

0000 0111 7

——————————

0000 0011 3 索引

最终计算出来的索引都是不一样的,减少了 hash 冲突,现在把 n 数组长度改成 9 (非 2 的 n 次方)

    

hash:2     n:9(非2的3次方)

计算公式: hash&(n - 1)

2 &(9-1)

0000 0010 2

0000 1000 8

——————————

0000 0000 0 索引

hash:3     n:9(非2的3次方)

计算公式: hash&(n - 1)

3 &(9-1)

0000 0011 3

0000 1000 8

——————————

0000 0000 0 索引

最终计算出来的索引都是一样的,发生 hash 冲突,所以这个计算公式是经过人家试验过发生概率最低的计算公式,别人总结出来的经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔道不误砍柴功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值