Java8 ArrayList的源碼分析(二)

緊接上篇,下面繼續講解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];
    }
相關文章
相關標籤/搜索