初始化没有指定容量是,ArrayList的容量为0
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
当第一次添加元素是,容量扩容为10
指定容量时:
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);
}
}
构造方法传入集合参数时:
会以集合的大小作为参数
public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray();
if ((size = a.length) != 0) {
if (c.getClass() == ArrayList.class) {
elementData = a;
} else {
elementData = Arrays.copyOf(a, size, Object[].class);
}
} else {
// replace with empty array.
elementData = EMPTY_ELEMENTDATA;
}
}
1.元素满之后,调用add()方法,再次添加触发扩容,新容量是原来容量的1.5倍(生成新数组,复制元素,原来数组被垃圾回收)
2.如果调用addAll()方法,需要扩容时,扩容规则是
数组扩容后大小取下次扩容1.5·倍扩容的容量 和 addAll()与原来元素个数之和 中的最大值
Math.max(Original.size()+addAll().size(),Original.size()*1.5);