3

对于避免这样做的最佳方法,我发现了相互矛盾的建议ConcurrentModificationException

    List<Apple> Apples = appleCart.getApples();
    for (Apple apple : Apples)
    {
        delete(apple);
    }

我倾向于使用 aIterator代替 aList并调用它的remove方法。

这在这里最有意义吗?

4

5 回答 5

5

是的,使用迭代器。然后你可以使用它的 remove 方法。

  for (Iterator<Apple> appleIterator = Apples.iterator(); appleIterator.hasNext();) {
     Apple apple = appleIterator.next();
     if (apple.isTart()) {
        appleIterator.remove();
     }
  }
}
于 2011-05-06T18:11:20.713 回答
2

如果您收到 ConcurrentModificationException,您可能有多个线程。

所以完整的答案包括使用 Iterator.remove()同步访问集合。

例如(所有可能修改列表的线程都同步锁定):

synchronized ( lock ) {
   List<Apple> apples = appleCart.getApples();
   for ( Iterator<Apple> it = apples.iterator(); it.hasNext(); )
   {
      Apple a = it.next(); 
      if ( a.hasWorm() ) {
         it.remove();
      }
   }
}
于 2011-05-06T18:17:47.887 回答
1
List<Apple> apples = appleCart.getApples();
for (Iterator<Apple> appleIterator = apples.iterator(); appleIterator.hasNext();)
{
   Apple apple = appleIterator.next();
   if ( apple.isYucky() ) {
     appleIterator.remove();
   }
}
于 2011-05-06T18:12:41.817 回答
0

您可以保留要删除的项目列表,然后在循环后删除它们:

List<Apple> apples = appleCart.getApples();
List<Apple> badApples = new ArrayList<Apple>();
for (Apple apple : apples) {
    if (apple.isBad()) {
        badApples.add(apple);
    } else {

    eat(apple);
}

apples.removeAll(badApples);
于 2011-05-06T18:15:27.917 回答
0

从 Java 8 开始,您现在可以这样做: apples.removeIf(apple -> apple.equals(this))

于 2018-10-25T21:19:44.750 回答