for循环与在并发修改异常中增强的for循环进行比较



我读到了关于并发修改异常的文章,并注意到在元素移除的情况下,使用增强的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循环可以取消注释

这是因为在"正常循环"代码中不涉及Iterator。相反,您可以使用get单独访问图元。

循环符号

for (String s: myList) {
...
}

在后台创建迭代器对象。迭代器跟踪集合的修改。当你在不使用迭代器的情况下进行修改时,你会得到一个ConcurrentModificationException。

使用时

for (int i = 0; i < myList.size(); i++) {
...
}

并使用访问集合

myList.get(i)

没有创建迭代器,因此没有机会抛出异常。

最新更新