基于JDK1.8
只列出關(guān)鍵方法,主要關(guān)注默認情況、初始化、擴容、add、remove。
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() { //默認是個空數(shù)組,也有重載方法可以設置初始數(shù)組大小
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public boolean add(E e) {
ensureCapacityInternal(size + 1); //關(guān)注這個方法
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默認就是10
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0) //超過數(shù)據(jù)長度
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //按1.5倍擴容
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
get(int index)比較簡單,直接返回elementData[index]。
ArrayList比較簡單,默認情況下是空數(shù)據(jù),第一次add默認初始化長度10,每次按1.5倍擴容。再看下remove
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1; //判斷是不是最后一項,如果不是最后一項,就把該index后面的數(shù)據(jù)項都賦值給前一位,然后再把最后一項設為null
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; //這行代碼值得很多人學習,數(shù)組集合里沒用的項要及時釋放
return oldValue;
}
附圖