ArrayList中資料刪除

2021-08-27 10:20:35 字數 1635 閱讀 2028

在迴圈arrayllist時,經常會遇到remove操作,那麼arraylist的remove的底層是怎麼做的?

abstractlist中,有乙個屬性modcount,這個屬性是跟蹤list中資料被修改的次數,任何對list的add/remove操作,都將導致modcount++.

在abstractlist中還有乙個內部類itr implements iterator,itr是乙個list遍歷的工具類,當然list.iterator()方法也是返回itr物件,在itr中有乙個校驗位屬性expectedmodcount;對於乙個itr物件,其初始時expectedmodcount=modcount.

iterator是list乙個檢視,其最終還是操作list的儲存結構.在使用iterator遍歷時,remove()操作,會導致modcount++(abstractlist.remove()),但是還有expectedmodcount=modcount,即在iterator中remove資料,會帶來expectedmodcount與modcount值的同步.

在iterator遍歷時,next(),remove()方法會校驗expectedmodcount與modcount值是否一致,如果不一致,就意味著這list資料在iterator外部被修改,此時iterator遍歷將會造成concurrentmodificationexception.

abstractllist不僅支援普通的iterator,還支援listiterator(arraylist,linkedlist均支援),listiterator增加了遍歷時雙向游標能力(previous,next),增加了add方法.add方法和remove方法一樣也做了expectedmodcount和modcount一致性校驗.

引申一下,如下四個對list資料刪除的**,有區別嗎??

如下是4中迴圈方式:

1) for(int i=0;ilist.remove(i);

2) for(int i=list.size()-1;i>=0;i--){

list.remove(i);

3)int size = list.size();

for(int i=size-1;i>-1;i--){

list.remove(i);

4) for(object i : list){

list.remove(i);//如果list中存在多個object互相equals時,此方法仍然有效.注意list.remove(object)內部使用了遍歷操作,並使用equals來比較物件並刪除.

5) iterator it = list.iterator()

while(it.hasnext()){

it.next();

it.remove();

1),2),3)是最普通的遍歷方式,但是在遍歷並有刪除操作時,似乎它們執行的結果還有些差距,根據座標刪除,那麼1)實事上只會有一半被刪掉,1)中每刪除一次,計算一次list.size(),但是當前i++,且前端刪除會造成陣列結構copy.

2)後端刪除,不會造成copy,每次都是刪除最後乙個位置,直至結束

3)因為size沒有重新計算,在刪除一半資料後,丟擲indexoutofbound***ception

4)/5)正常

ArrayList的資料刪除

在開發的過程中發現arraylist移除不了乙個資料 直接說原因刪除目標的實體未實現equals方法。正如如下 public class testremove class person public person string name public string getname public vo...

動態刪除ArrayList中的元素

public class arraylisttest 刪除list中值為 c 的元素 這種方式 當值為 c 的元素在arraylist中不連續儲存的時候,是可以把值為 c 的元素全部刪掉 但是當值為 c 的元素在arraylist中有連續儲存的時候,就沒有把值為 c 的元素全部刪除 因為刪除了元素,...

動態刪除ArrayList中的元素

昨天一位專案組同事需要在arraylist中刪除所有不等於指定值的元素,但是她弄了很久,發現總是刪得不完全。剛好我以前做過類似的功能,就告訴她是因為arraylist刪除元素後長度變小了,元素的索引也會跟著改變,但是迭代的下標沒有跟著相應的改變的緣故。將一些刪除方法做一些總結 刪除arraylist...