初始化
//初始化一个object数组 长度为0
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
Add第一个元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); // size = 0
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) { //0
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//如果为空的话(空构造函数)
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //取 DEFAULT_CAPACITY = 10 和 0 最大的值,结果为10
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) { //10
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0) //如果10 - 0 不大于0
grow(minCapacity);
}
添加第11个元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); // size = 10
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) { //11
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//不会进
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) { //11
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0) //如果11 - 10 大于0 扩容
grow(minCapacity);
}
private void grow(int minCapacity) { //10
// overflow-conscious code
int oldCapacity = elementData.length; //10
int newCapacity = oldCapacity + (oldCapacity >> 1); //newCapacity = 10+5 =15
if (newCapacity - minCapacity < 0) //15-10 >0
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0) // newCapacity(15) 没有超过Integer.MAX_VALUE - 8
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//复制数组 newCapacity(15)
}
//复制数组
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
//如果新类型是Object[]数组的话 就创建object数组 否则创建 新类型的数组, 长度为扩容后的长度
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
//复制数据到copy,数据终点为新长度和原始长度的最小值
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
get()
public E get(int index) {
rangeCheck(index);//检查越界 IndexOutOfBoundsException
return elementData(index); //时间复杂度O(1)
}
随机插入
//随机插入 耗时
public void add(int index, E element) {
//越界检查
rangeCheckForAdd(index);
//检查(size +1)是否需要扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
//拷贝后面的数组
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
//index元素赋值
elementData[index] = element;
size++;
}