ArrayList的add操作
publicbooleanadd(Ee){
ensureCapacityInternal(size+1);//IncrementsmodCount!!
elementData[size++]=e;
returntrue;
}
privatevoidensureCapacityInternal(intminCapacity){
if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
minCapacity=Math.max(DEFAULT_CAPACITY,minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
privatevoidensureExplicitCapacity(intminCapacity){
modCount++;
//overflow-consciouscode
if(minCapacity-elementData.length》0)
grow(minCapacity);
}
由此可见:每次添加元素到集合中时都会先确认下集合容量大小。然后将size自增1。ensureCapacityInternal函数中判断如果elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA就取DEFAULT_CAPACITY和minCapacity的最大值也就是10。这就是EMPTY_ELEMENTDATA与DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别所在。同时也验证了上面的说法:使用无惨构造函数时是在第一次添加元素时初始化容量为10的。ensureExplicitCapacity中对modCount自增1,记录操作次数,然后如果minCapacity大于elementData的长度,则对集合进行扩容。显然第一次添加元素时elementData的长度为零。那我们来看看grow函数。
privatevoidgrow(intminCapacity){
//overflow-consciouscode
intoldCapacity=elementData.length;
intnewCapacity=oldCapacity+(oldCapacity》》1);
if(newCapacity-minCapacity《0)
newCapacity=minCapacity;
if(newCapacity-MAX_ARRAY_SIZE》0)
newCapacity=hugeCapacity(minCapacity);
//minCapacityisusuallyclosetosize,sothisisawin:
elementData=Arrays.copyOf(elementData,newCapacity);
}