码迷,mamicode.com
首页 > 其他好文 > 详细

ArrayList扩容机制

时间:2020-08-05 00:14:26      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:max   oom   integer   empty   存储结构   方法   tcap   ini   lis   

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);
    }

ArrayList扩容机制

标签:max   oom   integer   empty   存储结构   方法   tcap   ini   lis   

原文地址:https://blog.51cto.com/12939243/2516726

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!