对于避免这样做的最佳方法,我发现了相互矛盾的建议ConcurrentModificationException
:
List<Apple> Apples = appleCart.getApples();
for (Apple apple : Apples)
{
delete(apple);
}
我倾向于使用 aIterator
代替 aList
并调用它的remove
方法。
这在这里最有意义吗?
对于避免这样做的最佳方法,我发现了相互矛盾的建议ConcurrentModificationException
:
List<Apple> Apples = appleCart.getApples();
for (Apple apple : Apples)
{
delete(apple);
}
我倾向于使用 aIterator
代替 aList
并调用它的remove
方法。
这在这里最有意义吗?
是的,使用迭代器。然后你可以使用它的 remove 方法。
for (Iterator<Apple> appleIterator = Apples.iterator(); appleIterator.hasNext();) {
Apple apple = appleIterator.next();
if (apple.isTart()) {
appleIterator.remove();
}
}
}
如果您收到 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();
}
}
}
List<Apple> apples = appleCart.getApples();
for (Iterator<Apple> appleIterator = apples.iterator(); appleIterator.hasNext();)
{
Apple apple = appleIterator.next();
if ( apple.isYucky() ) {
appleIterator.remove();
}
}
您可以保留要删除的项目列表,然后在循环后删除它们:
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);
从 Java 8 开始,您现在可以这样做:
apples.removeIf(apple -> apple.equals(this))