HashMap 扩容原理

今天有个朋友问我, 为啥hashMap扩容之后 数组的位置是 当前位置 或 当前位置 + oldCap 呢?

想了一下,举个例子最清楚了

我们模拟一下就清楚了,分别用两个key 进行确认数组位置  .我们默认全部每次扩容都是计算hash出来的结果
默认两个key 
key1.hash = 40 转换成二进制 101000
key2.hash = 19 转换成二进制 010011

默认数组长度  16 ==> 转换二进制 10000 , 由于是 newTab[e.hash & (newCap - 1)] = e;  所以最终 15 = 01111 

默认分配 
key1.hash = 40  与 19 

101000  40
001111  15
-------
001000 在数组第8位


key2.hash = 19 转换成二进制 010011

010011   19
001111   15
------
000011  在第3位

=================================================扩容之后===========================
 
默认数组长度  16<<1 = 32 ==> 转换二进制 100000 , 由于是 newTab[e.hash & (newCap - 1)] = e;  所以最终 31 = 011111

key1.hash = 40  与 19 
0101000  40
0011111  31
-------
0001000 在数组第8位

key2.hash = 19 转换成二进制 100011

0010011   19
0011111   31
-------
0010011 在第19位 等于 原长度oldLen16 + 之前所有位置3 

如果每次都这样就算,太浪费时间了
所以找寻规律

发现是否需要 加上原长度  只要将自己的hash 和oldLen(16)进行一次&就可以了


key1.hash = 40 转换成二进制 101000 位置在 8
key2.hash = 19 转换成二进制 010011 位置在3 

扩容判断 -- 每次都全量计算hash 性能很差, 可以做一次优化
key1.hash= 40 

0101000  40
0010000  16
--------
0000000  0   = 0 ?还是在原先位置 

key2.hash = 19
0010011  19
0010000  16
--------
0010000  16 !=0 那就是需要 newTab[j + oldCap] = hiHead; 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值