JDK1.7和JDK1.8下ArrayList()底层数组的默认长度
一、JDK1.7下ArrayList()初始化后的默认长度是10,源码如下:
//无参构造方法
public ArrayList() {
this(10);
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
从源代码可以看出,默认的构造方法里直接指定了数组长度为10,同时调用了重载的构造方法,在该方法里创建了长度为10的一个数组。
二、JDK1.8下ArrayList()初始化后的默认长度是0,源码如下:
//无参构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
构造方法中指定的数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}
,是个空数组,数组长度为0,所以说JDK1.8下的ArrayList()初始化后默认的数组长度为0.
那空数组是如何添加第一个元素的呢?查看源代码如下:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
在ensureCapacityInternal
方法里,elementData
是当前数组,if条件返回true,minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity)
=10
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
在ensureExplicitCapacity
方法里,minCapacity - elementData.length
=10-0=10,进入grow()
方法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
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);
}
oldCapacity
=0
newCapacity
=0+0=0
newCapacity - minCapacity
=0-10<0
newCapacity = minCapacity
=10
newCapacity - MAX_ARRAY_SIZE
<0
elementData = Arrays.copyOf(elementData, newCapacity)
将原数组的值复制到新数组,新数组的长度是10
综上所述,JDK1.8中ArrayList()初始化后的底层数组长度为0,且在添加第一个元素时,底层数据长度变为10,之后扩容按原来的1.5倍进行扩容。