当前位置: 首页 > 面试题库 >

Java:遍历列表时发生ConcurrentModificationException

高吉星
2023-03-14
问题内容

当我执行以下代码时,我得到ConcurrentModificationException

 Collection<String> myCollection = Collections.synchronizedList(new ArrayList<String>(10));
    myCollection.add("123");
    myCollection.add("456");
    myCollection.add("789");
    for (Iterator it = myCollection.iterator(); it.hasNext();) {
        String myObject = (String)it.next();
        System.out.println(myObject);
        myCollection.remove(myObject); 
        //it.remove();
    }

即使我正在使用Collections.synchronizedList,为什么也会出现异常?

当我将myCollection更改为

  ConcurrentLinkedQueue<String> myCollection = new ConcurrentLinkedQueue<String>();

我没有那个例外。

java.util.concurrent中的ConcurrentLinkedQueue与Collections.synchronizedList有何不同?


问题答案:

一个 同步 列表将不会提供新的实现Iterator。它将使用 同步
列表的实现。该执行的iterator()就是:

public Iterator<E> iterator() {
   return c.iterator(); // Must be manually synched by user! 
}

来自ArrayList

此类的迭代器和listIterator方法返回的迭代器是 快速失败的
:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,除非通过迭代器自己的remove或add方法,否则迭代器将抛出ConcurrentModificationException

来自ConcurrentLinkedQueue#iterator

以适当的顺序返回对该队列中的元素的迭代器。返回的迭代器是一个 “弱一致性
迭代器,它永远不会抛出ConcurrentModificationException,并保证遍历迭代器构造时存在的元素,并且可以(但不能保证)反映构造之后的任何修改。

这两个集合返回的迭代器在 设计上不同的



 类似资料:
  • 输入是一个列表列表。请看下面。文件名是一个列表,包含的名称与列表中的列表数量相同(,,) 每个名称都附加到路径中:-- 程序在遍历列表时遍历包含路径的列表,并打印路径及其文件名。我希望输出是--。然而,我得到了下面的输出。请查看输入后的输出 输入 输出 我希望输出是-- 然而,我得到的结果如下: 我无法理解为什么在遍历列表时不能使用文件名遍历路径列表。我希望这有助于澄清问题。有人能帮忙吗? 我已经

  • 问题内容: 我有以下对象和地图: 我想将地图转换成另一个地图。结果图的键是输入图的键。结果映射的值是My对象的属性“名称”,按优先级排序。 该 排序 和提取的名字是没有问题的,但我不能把它放到结果地图。我使用旧的Java 7方法进行操作,但是可以使用流API会很好。 有人知道吗?我试过了,但是被卡住了: 问题答案: 本质上,您将流式传输每个条目集并将其收集到新映射中。要计算新地图中的值,请从旧地图

  • 我有一个数组列表,其中包含我想要执行方法“计数”的实例化对象的名称。不过,我不确定是否/如何做到这一点。我有一个循环要扫描数组列表,并添加了伪代码。 我是java新手,不确定这是否可行,但如果有任何帮助,我将不胜感激。谢谢

  • 问题内容: 我想避免。我该怎么办? 问题答案: 您可以在迭代本身期间使用支持remove / add方法的。

  • 问题内容: 我的问题是我想在遍历新元素的同时扩展一个包含新元素的列表,并且希望迭代器继续刚才添加的元素。 根据我的理解,会在列表中的当前元素之前而不是之后添加一个元素。是否可以通过其他方式实现这一目标? 问题答案: 除了以外,您无法在修改集合时使用进行迭代。 但是,如果使用方法,该方法返回,并对其进行迭代,则您还有更多要修改的选项。从javadoc中获取: 新元素插入到隐式光标之前:…后续调用将返

  • 我试图自动化以下场景: < li >访问amazon.com < li >搜索耳机 < li >将第一个结果页面中的所有畅销书添加到购物车中 我为编写此场景所遵循的步骤: < li >访问amazon.com < li >在搜索字段中输入文本“耳机” < li >单击搜索按钮 < li >单击标记为“畅销书”的链接 < li >单击“添加到购物车”按钮 < li >导航回结果页面 < li >单击