最详细HashMap集合源码讲解(resize()方法)

最详细HashMap集合源码讲解(resize()方法)

1 HashMap中resize()的作用

resize()是HashMap中扩容的方法,当HashMap中存的数据量大于threshold时或进行初始化HashMap的时候会进行扩容的操作,即执行resize()方法进行扩容

1.1 执行resize()方法两种情况分析

1.1.1 在HashMap的putVal()方法中,会先判断table是否为空,如果为空的话,会执行resize(),然后就初始化table,代码如下
  if ((tab = table) == null || (n = tab.length) == 0)
                n = (tab = resize()).length;
1.1.2 在HashMap中的存储的数据量大于threshold时,会执行resize()方法,代码如下

在putVal()方法中,size表示当前HashMap的数据量,如果size大于threshold,则会执行该方法,进行扩容操作

  if (++size > threshold)
                resize();

1.2 resize()方法的原理及源码分析

  // resize即使table初始化的方法,也是扩容的方法
        final Node<K,V>[] resize() {
   
            //使用oldTab存储旧的table数组表
            java.util.HashMap.Node<K,V>[] oldTab = table;
            // 得到旧的table数组的长度,然后把值赋给oldCap,如果oldTab是为null,则把oldCap赋值为0
            int oldCap = (oldTab == null) ? 0 : oldTab.length;
            //用oldThr 存储旧hashMap的threshold;注意:threshold=数组长度*负载因子
            int oldThr = threshold;
            int newCap = 0;
            int newThr = 0;
            //如果旧的数组长度大于零
            if (oldCap > 0) {
   

                //旧的数组容量大于MAXIMUM_CAPACITY = 1 << 30即1073741824
                //则把新的数组长度设为2147483647
                if (oldCap >= MAXIMUM_CAPACITY) {
   
                    threshold = <
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值