這個問題在這里已經有了答案: Java 串列的 .remove 方法僅適用于每個回圈中的倒數第二個物件 [重復] (7 個回答) 3 天前關閉。
我已經開始學習集合,目前正在練習迭代器()。我讀到我們不能在使用 iterator() 時修改串列。請讓我明白為什么使用 if 子句洗掉串列可以正常作業?這是我的代碼:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
Integer i = it.next();
if(i==3)
list.remove(i);
}
System.out.println(list);
這段代碼作業正常 [1, 2, 4]
這是另一個沒有 if 子句的代碼:
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
Integer i = it.next();
list.remove(i);
}
System.out.println(list);
Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1043) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:997) at JavaCollections.CollectionIterator.main(CollectionIterator.java:21)
如果我們不能修改迭代器中的集合,它會拋出例外,為什么會這樣。
uj5u.com熱心網友回復:
您的代碼有效的原因是您在執行list.remove(i)和時從串列中洗掉了倒數第二個元素i == 3。
因為迭代器在第3項(與名單只有3個專案現在)it.hasNext()的回報false,it.next()是不是又一次打來電話,它不會引發錯誤。
如果您的串列有更多元素,或者您呼叫了 remove for i == 2,您將在第一個示例中看到相同的錯誤。
如果您正在使用迭代器,您應該只使用迭代器修改集合,在這種情況下,您將it.remove()洗掉檢索到的最后一個元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/388330.html
