java - 为什么当我尝试删除元素时此 ArrayList 会抛出 ConcurrentModificationException?

标签 java collections concurrency iterator

我试图从 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);
    }
}

任何评论,我做错了什么?

最佳答案

仅在使用 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();
    }
}

关于java - 为什么当我尝试删除元素时此 ArrayList 会抛出 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469210/

相关文章:

java - 高效下载base64文件

java - c 中的 JSTL 请求属性 :if

concurrency - POSIX 的 read() 和 write() 系统调用是原子的吗?

java - 如何检查变量是否引用 "this"集合中的元素?

php - PHP 中的什么集合可以对出现次数进行计数和排序

c# - 如果我调用 Thread.Join() 是否需要 volatile?

go - 为什么并发不能加速我的斐波那契函数?

java - JAVA中最后一个字符出现的次数只用String

java - 在 Elasticsearch 上使用正则表达式过滤器开始的正则表达式是什么?

C# 如何阻止代码在集合序列化期间循环导致计算器溢出?