// 数组默认初始长度
private static final int DEFAULT_CAPACITY = 10;
//空数组
private static final Object[] EMPTY_ELEMENTDATA = {};
// 默认空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//数组缓冲区
transient Object[] elementData; // non-private to simplify nested class access
//Arraylist的元素个数
@serial
private int size;
-
ArrayList类的属性
//有参构造器:指定数组大小,指定为0时,为EMPTY_ELEMENTDATA
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//无参构造器:数组为默认空数组。附带默认的初始大小为10,即上面的DEFAULT_CAPACITY
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
- ArrayList的三个构造器
-
//有参构造器:指定数组大小,指定为0时,为EMPTY_ELEMENTDATA public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } //无参构造器:数组为默认空数组。附带默认的初始大小为10,即上面的DEFAULT_CAPACITY public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
- 扩容
- 当向ArrayList添加元素,调用add()方法时,才会触发扩容机制
- 先扩容后添加元素,传入的参数为 list个数+1,以size+1,记作minCapacity进行扩容
- 只有当数组是无参构造函数返回的DEFAULTCAPACITY_EMPTY_ELEMENTDATA(默认空数组)时,minCapacity取Max(DEFAULT_CAPACITY,minCapacity),此时返回默认大小DEFAULT_CAPACITY 值为10,即返回10。如果是其它直接返回minCapacity。
然后又调用ensureExplicitCapacity(int minCapacity),如果minCapacity大于elementData的长度,则扩容。 -
至此扩容才真正开始
扩容指的是数组长度,而不是list的个数;但扩容方法使用的参数却是与list的个数,即size有关;
oldCapacity 为原来的数组长度,newCapacity是oldCapacity的1.5倍,如果仍小于minCapacity,则扩大至minCapacity大小(说明了minCapacity是扩容的最小值)。判断newCapacity是否 超过了最大容量MAX_ARRAY_SIZE ,
- 若超过则执行hugeCapacity(minCapacity)
- 判断minCapacity是否大于MAX_ARRAY_SIZE,如果大于则直接扩大值Integer最大值,否则返回MAX_ARRAY_SIZE。
最后通过elementData=Arrays.copyOf(elementData, newCapacity);将原来数据复制到扩容后的数组中。elementData[size++] = e;将新加入元素添加至数组中