ArrayList扩容机制

ArrayList扩容机制ensureCapacityInternal方法判断是否要扩容首先获取数组的旧容量,然后计算新容量的值,计算使用位运算,将其扩容至原来的1.5倍。默认容量是10,得到新容量的值后,校验扩容后的容量是否大于需要的容量,如果小于,则把最小需要容量当作扩容后的新容量。并确保扩容后的容量不超过数组能设置的最大大小值。最后将老数组的数据复制到新的数组中。3.ArrayList和LinkedList区

        private void ensureCapacityInternal(int minCapacity) { //扩容方法 minCapacity 期望的最小容量 10
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //如果数组为空
                minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默认容量和期望的最小容量取最大值 10
            }

            ensureExplicitCapacity(minCapacity);//扩容方法
        }
        private void ensureExplicitCapacity(int minCapacity) {//扩容方法
            modCount++;//修改次数+1

            // overflow-conscious code  //判断是否溢出
            if (minCapacity - elementData.length > 0)//如果(默认容量)期望的最小容量-数组长度>0 说明数组不够用 需要扩容
                grow(minCapacity); //扩容
        }
        private void grow(int minCapacity) {//扩容方法
            // overflow-conscious code
            int oldCapacity = elementData.length;  //旧容量
            int newCapacity = oldCapacity + (oldCapacity >> 1); //新容量=旧容量+旧容量/2 10+10/2=15
            if (newCapacity - minCapacity < 0)//如果新容量-期望的最小容量<0 说明新容量还是不够用
                newCapacity = minCapacity;//新容量=期望的最小容量
            if (newCapacity - MAX_ARRAY_SIZE > 0)// 如果新容量-最大容量>0 说明新容量还是不够用 说明数组已经很大了 不能再扩容了
                newCapacity = hugeCapacity(minCapacity);//新容量=最大容量
            // minCapacity is usually close to size, so this is a win://期望的最小容量通常接近于size,所以这是一个赢利
            elementData = Arrays.copyOf(elementData, newCapacity);//将数组扩容到新容量
        }

//        此时就完成了ArrayList的扩容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条 大鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值