源代碼實現
public E remove(int index) { rangeCheck(index);//先判斷數組是否越界 modCount++; E oldValue = elementData(index); //處理數據 int numMoved = size - index - 1;
//remove方法是將原數組的指定下標位置后面的值復制好然后再覆蓋原有的指定下標位置,再將最后的一個置為空方便gc
調用的system.arraytcopy
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代碼解釋:
Object src : 原數組
int srcPos : 從元數據的起始位置開始
Object dest : 目標數組
int destPos : 目標數組的開始起始位置
int length : 要copy的數組的長度 如果一個arraylist集合有0,1,2,3,4,5的數據
然后 remove(3)從原數組的下標為4就是4開始,復制兩個長度也就是4和5復制這兩個,
接着 從目標數組開始(這里也是當前數組)的下標為3這里將其覆蓋也就是變成0,1,2,4,5,5,
最后將最后一位置為null就變成0,1,2,4,5,null
if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
//源代碼
public void add(int index, E element) { rangeCheckForAdd(index);//判斷數組是否越界 ensureCapacityInternal(size + 1); // Increments modCount!!給數組擴容
同理
0,1,2,3,4,5
list.add(3,element)
從下標為3的數據開始往后面復制3個數即3,4,5
覆蓋到目標數組下標為4的位置,變成了0,1,2,3,3,4,5
最后將下標為3的值設置為添加的數據
System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }