HashMap 容量为2次幂的原因

我们都知道 hashmap 的底层是一个数组加链表的结构,当向其中添加一个元素的时候,需要根据key的hash值,去确定其在数组中的具体位置。
在这里插入图片描述
看源码,我们可以发现,确定数组位置的实现是 i=(n-1)& hash,其中 n 代表数组的长度,即map的容量。

当n为2的幂次方时,(n-1)& hash 的值是均匀分布的,我们假设n=16,hash从0开始递增:

hash(n-1)& hash结果
01111 & 00
11111 & 11
21111 & 102
31111 & 113
41111 & 1004
51111 & 1015
………………
161111 & 100000
171111 & 100011
181111 & 100102

当n不为2的幂次方时,(n-1)& hash 的值不是是均匀分布的,我们假设n=15,hash从0开始递增:

hash(n-1)& hash结果
01110 & 00
11110 & 10
21110 & 102
31110 & 112
41110 & 1004
51110 & 1014
………………
161110 & 100000
171110 & 100010
181110 & 100102

由上面可以看出,当我们根据key的hash确定其在数组的位置时,如果n为2的幂次方,可以保证数据的均匀插入,如果n不是2的幂次方,可能数组的一些位置永远不会插入数据,浪费数组的空间,加大hash冲突。
另一方面,一般我们可能会想通过 % 求余来确定位置,这样也可以,只不过性能不如 & 运算。而且当n是2的幂次方时:hash & (length - 1) == hash % length

因此,HashMap 容量为2次幂的原因,就是为了数据的的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值