【集合-HashMap】源码级理解HashMap之resize()方法,带你一行行手撕

HashMap系列文章(传送门):

一:源码级理解HashMap之深入构造方法和神奇位运算

二:源码级理解HashMap之resize()方法,带你一行行手撕

三:源码级理解HashMap之putVal()方法,一行行手撕源码

四:源码级理解HashMap之get()和remove()方法

  • 首先为什么要扩容?

为了解决哈希冲突造成的链化严重,影响查询效率的问题,扩容会环节该问题

  • 如何扩容:

走进源码

壹:一行行带你读源码

先读懂,后文会带你理清思路

final Node<K,V>[] resize() {
   
		//引用扩容前的哈希表
        Node<K,V>[] oldTab = table;
        //表示扩容前table数组的长度
        int oldCap = (oldTab == null) ? 0 : oldTab.length;
        //表示扩容前的扩容阈值,触发本次扩容的阈值
        int oldThr = threshold;
        //newCap:扩容之后table的大小
        //newThr:下一次扩容的阈值
        int newCap, newThr = 0;
        //如果oldCap>0,说明hashMap中的哈希表已经初始化了,这是一次正常的扩容
        if (oldCap > 0) {
   
        	//如果扩容之前table数组的大小已经达到了最大阈值后,就不再扩容,返回老数组,并设置阈值为最大容量
            if (oldCap >= MAXIMUM_CAPACITY) {
   
                threshold = Integer.MAX_VALUE;
                return oldTab;
            }
            //左移一位实现阈值翻倍并赋给新阈值,如果新阈值小于最大容量并且,老阈值大于默认容量16,就把阈值翻倍
            else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                     oldCap >= DEFAULT_INITIAL_CAPACITY)
                newThr = oldThr << 1; // double threshold
 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值