JAVA--遍歷List刪除元素報ConcurrentModificationException
阿新 • • 發佈:2018-11-19
直接上程式碼
ArrayList<Integer> list = new ArrayList<>(); { list.add(1); list.add(3); list.add(2); list.add(4); list.add(5); list.add(6); list.add(7); } @Test public void testRemoveListElement() { for (int i : list) { if (i % 2 == 0) { list.remove(i); } } // java.util.ConcurrentModificationException }
目的是想刪去集合中所有的偶數。
但是執行卻拋了ConcurrentModificationException錯誤
分析原因
根據報錯的資訊,可以看到是因為modCount != expectedModCount導致的。
再檢視859行,發現是在next()方法呼叫的checkForComodification();
然後我們再到ArrayList中檢視remove的原始碼,發現刪除一個元素的時候會做modCount++操作。
解決方案一
用多一個newList,新增符合條件的元素(即原判斷條件取反),最後返回這個newList即可
@Test
public void testRemoveListElement2() {
ArrayList<Integer> newList = new ArrayList<>();
for (int i : list) {
// 條件取反
if (i % 2 != 0) {
newList.add(i);
}
}
}
解決方案二
不適用foreach的形式,使用fori
@Test public void testRemoveListElement1() { for (int i = 0; i < list.size(); i++) { if (list.get(i) % 2 == 0) { list.remove(i); i--; } } }
同時這裡要注意每次刪除元素要把計數的i往前移一個,即i--;