【问题标题】:Why is this ArrayList throwing a ConcurrentModificationException when I try to remove an element?当我尝试删除元素时,为什么这个 ArrayList 会抛出 ConcurrentModificationException?
【发布时间】:2012-03-17 04:09:39
【问题描述】:

我正在尝试从 Arraylist 中删除特定元素,它会引发 ConcurrentModificationException

ArrayList<String> ar = new ArrayList<String>();
ar.add("a");
ar.add("b");
ar.add("c");
ar.add("a");
ar.add("e");
for(String st: ar){
    System.out.println("st="+st);
    if(st.equals("a")){
        ar.remove(st);
    }
}

任何cmets,我做错了什么?

【问题讨论】:

    标签: java collections concurrency iterator


    【解决方案1】:

    仅在使用Iterator.remove() 进行迭代时从数组中删除一个元素。

    for(String st: ar) { 这行有点误导。您实际上是在幕后创建了一个用于此迭代的迭代器。如果需要从迭代中移除元素,则需要显式使用迭代器,以便调用iterator.remove()

    ArrayList<String> ar = new ArrayList<String>();
    ar.add("a");
    ar.add("b");
    ar.add("c");
    ar.add("a");
    ar.add("e");
    Iterator<String> it = ar.iterator();
    while (it.hasNext()) {
        String st = it.next();
        System.out.println("st="+st);
        if (st.equals("a")) {
            it.remove();
        }
    }
    

    【讨论】:

    • 那么,在使用ArrayList.forEach() 时,您还必须使用Iterator.remove()ArrayList 中删除一个元素?
    【解决方案2】:

    您正在修改您正在迭代的数组。 我建议你使用 Iterator 来做类似的事情。

    【讨论】:

    • 感谢您的规范。像我这样的新手也可以向 cmets 学习 :)
    • @SteveKuo For-each 确实使用了迭代器,但无法调用其remove() 方法,因此如果将 maVVamaldo 解释为“使用显式 运算符”,因为这将允许通过 Iterator.remove() 安全删除。
    【解决方案3】:

    在迭代该集合时,您正在从集合中删除一个元素,而无需使用迭代器来执行此操作。不要那样做。有很多选择,主要是:

    • 改用索引(getremove(int))注意计数,以免跳过项目

         for (int i = 0; i < ar.size(); i++) {
             String st = ar.get(i);
             System.out.println("st="+st);
             if(st.equals("a")) {
                 ar.remove(i);
                 i--; // We want to use this index again
             }
         }
      
    • 建立要删除的项目集合,然后将它们全部删除

        List<String> elementsToRemove = new ArrayList<String>();
        for(String st: ar){
            System.out.println("st="+st);
            if(st.equals("a")){
                elementsToRemove.add(st);
            }
        }
        ar.removeAll(elementsToRemove);
      
    • 如果迭代器支持移除,则使用迭代器移除(就像ArrayList's 所做的那样)

        for (Iterator<String> it = ar.iterator(); it.hasNext(); ) {
            String st = it.next();
            System.out.println("st="+st);
            if(st.equals("a")) {
                it.remove();
            }
        }
      

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 1970-01-01
      • 2014-06-03
      • 2016-06-20
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多