我正在阅读有关并发修改异常的信息,并注意到在使用增强的for循环删除元素的情况下会引发并发修改异常,而普通的for循环则没有。 有人可以在代码下方帮助我了解为什么会发生这种情况
import java.util.ArrayList;
import java.util.List;
public class ConcurrentModificationExceptionExample {
public static void main(String args[]) {
List<String> myList = new ArrayList<String>();
myList.add("1");
myList.add("2");
myList.add("3");
myList.add("4");
myList.add("5");
// enhanced for loop
/* for(String s:myList){
if(s.equals("1")){
myList.remove("1");
}
}*/
// normal for loop
for(int i = 0; i<myList.size(); i++){
if(myList.get(i).equals("1")){
myList.remove("1");
}
}
System.out.println(myList);
}
}
用于测试//可以取消注释for循环
答案 0 :(得分:2)
这是因为在您的“常规循环”代码中没有Iterator
涉及。而是使用get
分别访问元素。
答案 1 :(得分:2)
循环符号
for (String s: myList) {
...
}
在幕后创建一个迭代器对象。迭代器跟踪集合的修改。在不使用迭代器的情况下进行修改时,将收到ConcurrentModificationException。
使用时
for (int i = 0; i < myList.size(); i++) {
...
}
并使用
访问收藏集myList.get(i)
没有创建迭代器,因此没有机会引发异常。