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!
推薦閱讀:
- java數據結構ArrayList詳解
- Java集合中的fail-fast(快速失敗)機制詳解
- Java集合之同步容器詳解
- 為什麼在foreach循環中JAVA集合不能添加或刪除元素
- Java ArrayList與LinkedList使用方法詳解