标签: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);
}
标签:max oom integer empty 存储结构 方法 tcap ini lis
原文地址:https://blog.51cto.com/12939243/2516726