gpt4 book ai didi

java - ConcurrentModificationException : . add() 与 .addAll()

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:46:33 25 4
gpt4 key购买 nike

为什么会出现以下情况?不应该两者都起作用吗?

List<String> items = data;
for( String id : items ) {
List<String> otherItems = otherData;

// 1. addAll()
//Causes ConcurrentModificationException
items.addAll(otherItems);

// 2. .add()
//Doesn't cause exceptions
for( String otherId : otherItems ) {
items.add(otherId);
}
}

是不是因为add()添加到集合项目,但 addAll()创建一个新集合,从而将 Items 修改为 List 的不同实例?

编辑 itemsotherItems是混凝土类型ArrayList<String> .

最佳答案

这两种操作都不合适,因为它在迭代集合的同时修改了集合。

检查 the implementation of ArrayList显示调用 addaddAll 应该会在下一个循环迭代中成功抛出 ConcurrentModificationException。它没有为 add 这样做的事实意味着,对于您拥有的特定 Java 版本,ArrayList 类中存在一个模糊的错误;或者(更有可能)otherItems 为空,因此在第二种情况下,您实际上根本没有调用 add

我确定 otherItems 必须为空,因为如果以您想要的方式添加到 Items 列表“有效”,那么它会在循环,导致它无限循环,直到死于 OutOfMemoryError。

关于java - ConcurrentModificationException : . add() 与 .addAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com