在并发修改异常中,for循环比较增强了for循环

时间:2019-01-10 05:29:36

标签: java java.util.concurrent

我正在阅读有关并发修改异常的信息,并注意到在使用增强的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循环

2 个答案:

答案 0 :(得分:2)

这是因为在您的“常规循环”代码中没有Iterator涉及。而是使用get分别访问元素。

答案 1 :(得分:2)

循环符号

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

在幕后创建一个迭代器对象。迭代器跟踪集合的修改。在不使用迭代器的情况下进行修改时,将收到ConcurrentModificationException。

使用时

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

并使用

访问收藏集
myList.get(i)

没有创建迭代器,因此没有机会引发异常。