ArrayList扩容机制(基于jdk1.8)

ArrayList是Collection的派生类,数据存储结构为Object[]数组,

 transient Object[] elementData;

日常使用中,当我们创建一个无参的ArrayList对象时,这也是我们日常使用比较多的构造函数,

/**
 * Constructs an empty list with an initial capacity of ten.
 */
    public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

其全局属性elementData存放元素的数组会被赋值一个空数组,

 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

当我们调用ArrayList的add方法时,就会涉及到扩容机制了,首次添加元素时,因为存放元素的数组为空数组,会先设置一个长度为10的数组长度对空数组扩容,调用

Arrays.copyOf(elementData, newCapacity); //newCapacity=10

进行扩容。
当添加的元素超过10个时,首先会扩容至长度15,以此类推,每次扩容至原长度的右移1位的长度,即15+15>>1 =22,22+22>>1 = 33...
最大能扩容的长度为Integer.MAX_VALUE=2的31次方-1,即2147483647

//首次超过原数组长度,minCapacity = 11
 private void grow(int minCapacity) {
        // 原数组长度为10
        int oldCapacity = elementData.length;
                //新长度设置为原数组长度的1.5倍,即15
        int newCapacity = oldCapacity + (oldCapacity >> 1);
                //保证新扩展长度能保证存入新数据
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
                //保证新长度不超过最大能分配长度,防止发生OOM
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值