我有以下抛出 ConcurrentModificationException 的代码。 有人可以解释一下为什么会发生这种情况吗?
public void foo(ArrayList<Bet> bets)
Iterator it1 = bets.iterator();
while(it1.hasNext())
Bet b1 = (Bet) bets.next()
Iterator it2 = bets.iterator();
while(it2.hasNext())
if(bet1.equals(bet2))
it2.remove();
it1.remove(); //ConcurrentModificationException thrown here
是否每次调用 iterator.next() 时我只能调用一次 iterator.remove() , 在下一次调用 iterator.next() 之前调用 remove 两次会导致这种情况吗?
任何帮助都会非常感谢。
最佳答案
您需要将所有删除收集到一个 Set
中,并在所有迭代完成后删除它们。
public void foo(ArrayList<Bet> bets) {
Set<Bet> remove = new HashSet<Bet>();
for ( Bet bet1 : bets ) {
for ( Bet bet2 : bets ) {
// Not the same but equal.
if ( bet1 != bet2 && bet1.equals(bet2)) {
remove.add(bet1);
remove.add(bet2);
}
}
}
bets.removeAll(remove);
}
关于java - 同时从 ArrayList 中删除两个对象而不引发 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318785/