gpt4 book ai didi

java - 迭代 Collection,避免在循环中删除对象时出现 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-01 18:33:36 25 4
gpt4 key购买 nike

我们都知道您无法执行以下操作,因为 ConcurrentModificationException :

for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}

但这显然有时有效,但并非总是有效。下面是一些具体代码:

public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();

for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}

for (int i : l) {
if (i == 5) {
l.remove(i);
}
}

System.out.println(l);
}

这当然会导致:

Exception in thread "main" java.util.ConcurrentModificationException

即使多个线程没有这样做。无论如何。

解决这个问题的最佳方案是什么?如何在循环中从集合中删除项目而不引发此异常?

我还使用任意 Collection在这里,不一定是 ArrayList ,所以你不能依赖get .

最佳答案

Iterator.remove()是安全的,你可以这样使用它:

List<String> list = new ArrayList<>();

// This is a clever way to create the iterator and call iterator.hasNext() like
// you would do in a while-loop. It would be the same as doing:
// Iterator<String> iterator = list.iterator();
// while (iterator.hasNext()) {
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
// Remove the current element from the iterator and the list.
iterator.remove();
}
}

请注意Iterator.remove()是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改基础集合,则行为未指定。

来源: docs.oracle > The Collection Interface

<小时/>

同样,如果您有一个 ListIterator 并想要添加项,则可以使用 ListIterator#add ,出于同样的原因,您可以使用 Iterator#remove - 它的设计允许这样做。

<小时/>

在您的情况下,您尝试从列表中删除,但如果在迭代其内容时尝试放入Map中,则适用相同的限制。

关于java - 迭代 Collection,避免在循环中删除对象时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60111555/

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