public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList继承了 AbstractList 实现了List接口,RandomAccess接口,Cloneable接口
serialVersionUID适用于Java的序列化机制,这个我们今天先不用过多考虑
private static final long serialVersionUID = 8683452581122892189L;
初始的默认初始容量10
private static final int DEFAULT_CAPACITY = 10;
空数组
private static final Object[] EMPTY_ELEMENTDATA = {};
这个也是一个空数组,但是区别是什么呢???
当第一个元素被加进来的时候DEFAULTCAPACITY_EMPTY_ELEMENTDATA 知道如何扩张,在之后的源码解析会再次解释。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
elementData数组用来存储ArrayList中的数据(ArrayList的底层数据结构是数组)
transient Object[] elementData;
记录集合中所存储元素的个数
private int size;
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() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
根据索引加入一个指定数据
public void add(int index, E element) {
//位置有效性检查
rangeCheckForAdd(index);
//添加修改次数,判断是否需要扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
//完成数组自身从index开始的所有元素拷贝到index+1开始且长度为size-index的位置上。
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
//上面是完成自身的拷贝
//下面将add的这个数据添加到index位置上
elementData[index] = element;
size++;
}
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)//是否越界鸭???
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容至原大小的1.5倍
if (newCapacity - minCapacity < 0)//如果扩张的大小过小,则至少扩容至minCapacity
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)//如果扩容的大小过大,Integer.MAX_VALUE=MAX_VALUE = 0x 7fff ffff
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//将数组中数据copyOf()到新的数组中
}
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength]; //创建一个新长度的数组
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
//public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}