初次调用无参构造的时候构造一个空的{},
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
第一次添加元素时,调用add(E e)方法,这个方法内部:
先执行ensureCapacityinternal(检测实际容量)方法 ,传入一个参数mincapcity:(size+1),
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
判断当前没有任何元素也就是空,执行初始化容量为10;执行 ensureExplicitCapacity(minCapacity);
否则视为不是第一次添加,跳过这一步, 执行ensureExplicitCapacity(minCapacity);
仍然把size+1作为参数,如果不需要扩容的话,以第一次扩容前为例,size+1总是小于defaltcapcity10比较判断为假,,不会执行扩容;
如果需要扩容,假设size=10,此时添加第11个元素需要扩容,size+1=11作为参数传入,同defaltcapcity比较判断为真,执行grow,创建一个1.5倍容量的数组并将原来的数组复制过来;
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
再执行第二步骤:把e(我们需要添加的内容)赋给以size++作为下标的数组元素;
elementData[size++] = e;
原文:https://www.cnblogs.com/msslearning/p/14862285.html