我有以下代码引发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()之前,调用两次被删除导致了此情况?

任何帮助将非常感谢。

最佳答案

您需要将所有删除内容收集到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);
}

10-06 01:35