//elementData中已存放的元素的个数,注意:不是elementData的容量
private intsize;//elementData的默认容量为10
private static final int DEFAULT_CAPACITY = 10;//对象数组:ArrayList的底层数据结构,transient表示该字段不进行序列化操作
transientObject[] elementData;//实例化一个空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={};//实例化一个空数组
private static final Object[] EMPTY_ELEMENTDATA ={};protected transient int modCount = 0;
@Nativepublic static final int MAX_VALUE = 0x7fffffff;private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;/*** 向elementData末尾中添加元素
*/
public booleanadd(E e) {//确保对象数组elementData有足够的容量,可以将新加入的元素e加进去
ensureCapacityInternal(size + 1);//加入新元素e,size加1
elementData[size++] =e;return true;
}//minCapacity = seize+1,即表示执行完添加操作后,数组中的元素个数
private void ensureCapacityInternal(intminCapacity) {//判断是否是空数组
if (elementData ==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//用最小容量和10进行比较,取最大值赋值给最小容量
minCapacity =Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}/***确保数组的容量足够存放新加入的元素,若不够,要扩容
*/
private void ensureExplicitCapacity(intminCapacity) {
modCount++;//如果数组个数minCapacity (size+1)大于数组长度就需要进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}private void grow(intminCapacity) {int oldCapacity =elementData.length;//将旧的数组容量增加为原来的1.5倍作为新的容量
int newCapacity = oldCapacity + (oldCapacity >> 1);//如果新的容量小于数组个数,将数组个数赋值给新容量
if (newCapacity - minCapacity < 0)
newCapacity=minCapacity;//如果新的容量大于最大容量,就根据数组个数来决定新的容量大小
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity=hugeCapacity(minCapacity);//根据新的容量,将数组拷贝到新的数组并赋值给数组
elementData =Arrays.copyOf(elementData, newCapacity);
}private static int hugeCapacity(intminCapacity) {//如果数组个数小于0抛出OutOfMemoryError异常
if (minCapacity < 0) //overflow
throw newOutOfMemoryError();//如果最数组个数大于最大容量 就返回最大值,否则返回最大容量
return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}/*** 向elementData指定位置添加元素
*/
public void add(intindex, E element) {//指定位置检查
rangeCheckForAdd(index);//扩容检查
ensureCapacityInternal(size + 1); //Increments modCount!!//通过拷贝使数组内位置为 index 到 (size-1)的元素往后移动一位
System.arraycopy(elementData, index, elementData, index + 1,
size-index);//找到位置添加元素
elementData[index] =element;//元素个数加一
size++;
}//判断指定位置是否超出数组个数
private void rangeCheckForAdd(intindex) {if (index > size || index < 0)throw newIndexOutOfBoundsException(outOfBoundsMsg(index));
}/***@paramsrc 原数组.
*@paramsrcPos 原数组的起始位置.
*@paramdest 目标数组.
*@paramdestPos 目标数组的起始位置.
*@paramlength 拷贝长度.
*/
public static native void arraycopy(Object src, intsrcPos,
Object dest,intdestPos,int length);