从集合中删除项目时出现java.util.ConcurrentModificationException

时间:2015-07-27 16:46:32

标签: java collections

我正在学习Java的Collection框架。我写了这个小程序来检查为什么我们不能使用For-each来删除元素。

代码:

import java.util.ArrayList;

class intro{
    public static void main(String args[]){
        ArrayList<String> names = new ArrayList<String>();
        names.add("Rajat");
        names.add("Saxena");

        for(String name:names){
            names.remove(name);
        }

        for(String name:names){
            System.out.println(name);
        }
    }
}

输出:

Saxena

import java.util.ArrayList;

class intro{
    public static void main(String args[]){
        ArrayList<String> names = new ArrayList<String>();
        names.add("Rajat");
        names.add("Saxena");
        names.add("Arvind");

        for(String name:names){
            names.remove(name);
        }

        for(String name:names){
            System.out.println(name);
        }
    }
}

抛出:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at intro.main(intro.java:15)

为什么只是在集合中添加一个元素会导致错误?

1 个答案:

答案 0 :(得分:2)

通常,当您在循环集合时从集合中删除元素时,您将获得ConcurrentModificationException。这部分是Iterator接口具有remove()方法的部分原因。使用迭代器是在遍历它们时修改元素集合的唯一安全方法。 代码将是这样的:

ArrayList<String> names = new ArrayList<String>();
    names.add("Rajat");
    names.add("Saxena");
    names.add("Arvind");
for (Iterator<String> iterator = name.iterator(); iterator.hasNext();) {
           String string = iterator.next();
           if (string.isEmpty()) {
                 iterator.remove();
}
}