java ArrayList中的remove方法介紹

先看一段代碼,看看自定義的ArrayList中的remove設計是否有問題。

public class MyArrayList {
    private Object[] mData = new Object[0];
    private int mSize = 0;
    // 刪除第i個元素
    public void remove(int i) {
        if (i < 0 || i >= mSize) return;
        for (int index = i; index < mSize - 1; index++) {
            mData[index] = mData[index + 1];
        }
        --mSize;
    }
    // ... 其他方法略
}

走進源碼:

針對remove,有兩種方式實現

(1)根據位置刪除,代碼如下所示:

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;
    }

實現步驟:

檢查所要移除的位置是否落在數組元素長度之內。

修改次數+1把需要刪除的元素賦給oldValue,一遍方法返回舊元素numMoved計算出的是刪除元素後需要移動的元素數。

當numMoved>0 說明刪除元素後需要把後面的元素往前移動。

當numMoved<0 時,說明刪除的元素為最後一個元素。

直接把最後一個位置置空。(分析重點:將最後的位置要設置為空,讓垃圾回收器回收 ,防止對象遊離)返回被刪值

(2)根據內容刪

參考資料:

public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
}

其中的fastRemove,代碼如下:

private void fastRemove(int index) {
        modCount++;
        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
}

實現步驟:

因為對象是否相等需要使用equals方法,但是空對象不能使用equals方法比較。

因此需要先判斷傳入的對象是否為空。

為空時 使用==來尋找數組中空對象並刪除。不為空時,便使用equals遍歷尋找來刪除相應對象。

OK,ArrayList的第一階段的研究到此結束,針對開頭的問題,已經找到瞭答案。

remove的設計有問題,–mSize;之後需要把mData[–mSize]=null;讓垃圾回收器回收 ,防止對象遊離。

未來有時間的研究方向大概如下,

​ArrayList​​ VS ​​LinkedList​

如何自定義一個​​ArrayList​

ArrayList的研究有時間可以再深入瞭解一下。網上的文章已經很多,在此不在贅述。旨在加深自我認知,上述大傢如有疑問,歡迎PK。

到此這篇關於java ArrayList中的remove方法介紹的文章就介紹到這瞭,更多相關java ArrayList中的remove內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: