java ArrayList中的remove方法介紹
先看一段代碼,看看自定義的ArrayList中的remove設(shè)計是否有問題。
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,有兩種方式實現(xiàn)
(1)根據(jù)位置刪除,代碼如下所示:
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;
}實現(xiàn)步驟:
檢查所要移除的位置是否落在數(shù)組元素長度之內(nèi)。
修改次數(shù)+1把需要刪除的元素賦給oldValue,一遍方法返回舊元素numMoved計算出的是刪除元素后需要移動的元素數(shù)。
當(dāng)numMoved>0 說明刪除元素后需要把后面的元素往前移動。
當(dāng)numMoved<0 時,說明刪除的元素為最后一個元素。
直接把最后一個位置置空。(分析重點:將最后的位置要設(shè)置為空,讓垃圾回收器回收 ,防止對象游離)返回被刪值
(2)根據(jù)內(nèi)容刪
參考資料:
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
}實現(xiàn)步驟:
因為對象是否相等需要使用equals方法,但是空對象不能使用equals方法比較。
因此需要先判斷傳入的對象是否為空。
為空時 使用==來尋找數(shù)組中空對象并刪除。不為空時,便使用equals遍歷尋找來刪除相應(yīng)對象。
OK,ArrayList的第一階段的研究到此結(jié)束,針對開頭的問題,已經(jīng)找到了答案。
remove的設(shè)計有問題,–mSize;之后需要把mData[–mSize]=null;讓垃圾回收器回收 ,防止對象游離。
未來有時間的研究方向大概如下,
?ArrayList?? VS ??LinkedList??
如何自定義一個??ArrayList??
ArrayList的研究有時間可以再深入了解一下。網(wǎng)上的文章已經(jīng)很多,在此不在贅述。旨在加深自我認知,上述大家如有疑問,歡迎PK。
到此這篇關(guān)于java ArrayList中的remove方法介紹的文章就介紹到這了,更多相關(guān)java ArrayList中的remove內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之線程鎖相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java線程的相關(guān)知識,文章圍繞著Java線程鎖展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Java 和 JavaScript 真正通用的Base64編碼詳解
這篇文章主要介紹了Java 和 JavaScript 真正通用的Base64編碼詳解的相關(guān)資料,附有Java和Javascript 的Base64編碼,需要的朋友可以參考下2016-11-11
Spring Boot LocalDateTime格式化處理的示例詳解
這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼
這篇文章主要介紹了Java經(jīng)典排序算法之歸并排序?qū)崿F(xiàn)代碼,歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應(yīng)用,將已有序的子序列合并,得到完全有序的序列,需要的朋友可以參考下2023-10-10

