迭代時移除List中的元素的正確方式

2021-10-01 16:54:00 字數 1511 閱讀 2511

如果遇到需要迴圈刪除list中匹配的元素,相信很多小夥伴第乙個想到的辦法就是使用for迴圈遍歷,然後使用挨個比較,如果相等則刪除元素,即如下面的**所示:

listlist = new arraylist<>();

list.add("a");

list.add("b");

list.add("c");

list.add("d");

for (int i = 0; i < list.size(); i++)

//[b, d]

system.out.println(list);

上面的**應該是經常見到的,我們執行程式,發現結果輸出為:

[b, d]
驚不驚喜意不意外,list居然沒有全部刪除掉,其實很多小夥伴們都犯過這種錯誤,為什麼會出現這種情況呢?

當乙個元素被移除時,該list的大小(size)就會縮減,同時也改變了索引的指向,也就是上面的**只會迴圈兩次,長度在不斷減少,第一次迴圈0 < 4 ,第二次迴圈 1 < 3 ,不滿足下一次迴圈條件 2 < 2,故只有兩次迴圈就結束。所以,在迭代的過程中使用索引,將無法從list中正確地刪除多個指定的元素。

那既然for迴圈不行,那我們換成foreach試試,**如下:

listlist = new arraylist<>();

list.add("a");

list.add("b");

list.add("c");

list.add("d");

for (string str : list)

}system.out.println(list);

執行**,很遺憾,報錯了,如圖:

麻蛋,為什麼呢?

其實,在 foreach迴圈中,編譯器使得 remove()方法先於next()方法被呼叫,這就導致了concurrentmodificationexception 異常,我們debug原始碼看一下,在下圖位置丟擲異常:

由此我們知道,正常情況下,next()方法必須在remove()方法之前被呼叫,這樣才能正確移除元素,我們優化**如下:

listlist = new arraylist<>();

list.add("a");

list.add("b");

list.add("c");

list.add("d");

iteratoriterator = list.iterator();

while (iterator.hasnext())

}//[b, c, d]

system.out.println(list);

所以,這才是在迴圈中移除list元素的正確姿勢。 明天聖誕節了,今晚平安夜,都吃蘋果沒,祝小夥伴們平安夜快樂呀。

list移除元素容易發生的問題

list 大家應該並不陌生,如果移除list中的元素呢,也不難,首先想到就是其remove 方法。下面列出remove 的具體實現,以供參考 test public void testremovelist system.out.println list.tostring listlist11 lis...

在list使用remove移除元素的問題

當我們在對集合中的元素進行操作時,通過foreach對集合進行遍歷並且使用remove 方法時,如以下 public class test for string a list 此時程式會報錯 這是因為迭代器內部維護了索引位置相關的資料,它要求在迭代過程中,容器不能發生結構性變化,所謂結構性變化就是 ...

移除陣列中的元素(2)

移除陣列 arr 中的所有值與 item 相等的元素,直接在給定的 arr 陣列上進行操作,並將結果返回 示例1複製 1,2,2,3,4,2,2 2複製 1,3,4 function removewithoutcopy arr,item for i 0 i引數 描述index 必需。整數,規定新增 ...