hashmap扩容为何为何是2的n次幂

HashMap的内存结构由数组和链表组成,通过key的hashcode进行快速查找。Java中使用hash值与数组长度-1进行与运算来确定索引,以2的n次幂作为数组长度能确保所有位都被利用,降低碰撞概率。当容量不足时,HashMap会进行扩容,通常选择2的幂次增长,以避免空间浪费和提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hashmap 的内存结构是数组加链表
为了使值均匀的分布在数组里,尽可能减少碰撞,增加查询的效率,减少空间的浪费。
可以使用key的hashcode去查找,因为hash的时间复杂度是1,速度比较快。
然后hash值取模 % 数组的长度 -1。
但是与运算& 比取模%速率要快些。
所以Java官方使用了与运算&。
运算&的特点是11为1,10 或者00为0。
这里有个比较巧妙的地方就是:
2的n次幂转换为2进制最后一位都是0
8 1000 16 10000
因为key的hash值是跟数组的长度减一与运算&
所以数组从长度减一以后,后几位就变成了1111,全都是1
不同的key算得得index相同的几率较小
举个例子
在这里插入图片描述

两组的hashcode均为8 1000 和9 1001
分别与数组长度-1 15(1111)和14(1110)取与运算
对15运算分别是 1001 1000,14运算都是1000
发生碰撞的几率大了很多
因为14二进制的最后一位是0
所以不管什么hash只跟14取与运算最后一位肯定也是0
所以数组下标最后一位是1的肯定不会存放数据
比如0001,0011,0101,1001,1011,0111,1101
空间浪费相当大,发生碰撞的几率会更高
所以hashMap的容量扩容时一定是2的n次幂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值