10、说说HashMap是如何进行扩容的可以吗?

有两个hash值,他们俩可能高16位是一样的,低16位是不一样的,这个时候直接让他去与(n-1)去进行与运算,与出来高16位反正都是0,如果与出来低16位是一样的,那么他们hash冲突就会有问题,所以把这两个hash值高低16位,去异或一下,让他们两低16位不一样,这个时候他们与出来,位置就不一样了 

 

判断二进制结果中是否多出一个bit的1,如果没多,那么就是原来的index,如果多了出来,那么就是index + oldCap,通过这个方式,就避免了rehash的时候,用每个hash对新数组.length取模,取模性能不高,位运算的性能比较高

 

总结一下:

首先resize()方法进行扩容,会拿到当前容量的大小,如果容量等于0的话,就会给他一个初始容量大小16,然后设置临界值为初始容量16 * 负载因子 0.75,也就是12了,然后将扩容好的tab返回

如果容量大于0的话,就会去判断当前容量是否大于最大限制容量 2^30 次幂,如果会大于的话,就设置临界值为 2^31 - 1,返回oldTab

如果当前容量的两倍小于最大限制容量,并且大于等于初始容量16的话,就设置新临界值为当前临界值的两倍,然后新建一个tab,将oldTab的数据放到newTab中,这个时候会rehash,然后将newTab返回,这就是HashMap的扩容机制了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值