緊接上篇,下面繼續講解ArrayList的源碼數組
在add方法後, 繼續講解remove()方法code
public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
在remove方法,get方法執行的第一步都會執行rangeCheck(index)方法,這個方法以下對象
private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
就是判斷傳進來的下標,是否超過了數組的總長度,拋出數組越界異常。 remove方法就是把想刪除的元素以後,所有向前移動一位,而後把數組的最後一位置爲空(讓gc回收,之前博客講解過),同時size的變量要減1,這時候elementData.lenght會比size大於,因此這就是爲何判斷數組的長度不能使用elementData.length, 而必須使用變量size來作長度標記。element
ArrayList 的get 方法就比較簡單,直接返回底層數組下標返回的對象就能夠了,以下rem
public E get(int index) { rangeCheck(index); return elementData(index); } E elementData(int index) { return (E) elementData[index]; }