HashMap源码之resize()详解

请配合源码食用本文
jdk版本:1.8

本文重点:

if (newThr == 0)的原理

进入正文:

四种扩容情况

(oldCap、oldThr、newCap、newThr 指:旧表长度、旧表阈值、新表长度、新表阈值)

  1. 旧表已初始化了 (oldCap>0)

    1. 旧表长度 >= 230 ,无法再扩容,将阈值threshold设为int最大值,直接返回

    2. 默认初始容量(24)<= 旧表长度 < 229 (右边不取等号,那229 怎么办?)

      • 此时正常扩容:长度、阈值都翻倍(*2)

      • 注意这里的实现:

        if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                             oldCap >= DEFAULT_INITIAL_CAPACITY)
                        newThr = oldThr << 1; 
        

        (newCap = oldCap << 1) 这种实现保证了无论条件是否成立,新表长度都等于旧表长度的两倍,但新阈值则符合条件才能翻倍

  2. 旧表未初始化,但旧阈值(oldThr)>0 。对应情况:new时指定了initialCapacity

    - 操作:  新表长度 = 旧阈值 (newCap = oldThr)
    
  3. 其余情况,指未初始化,旧阈值也为0。最常见,因为对应情况:无参构造

    /* 经典操作 */
    newCap = DEFAULT_INITIAL_CAPACITY;   // 16
    newThr 
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值