java - 同时从 ArrayList 中删除两个对象而不引发 ConcurrentModificationException?

标签 java iterator iteration concurrentmodification

我有以下抛出 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/

相关文章:

java - 使用java将html导入Lotus Notes Richtext

java - Hibernate columnDefinition 到mediumblob 不起作用

c++ - 检查/修改迭代器 "constness"

C++ 迭代器与带有 length() 方法的对象

c++ - 标准容器的迭代器是 DefaultConstructible 吗?

mysql - 在 MySQL 中循环遍历枚举

java - 如何修复错误 "contractor can' 并将上传应用于给定类型”?

java - 如何在android中使用动画翻转图像

python - 迭代迭代器对象中的 "1 or more"元素?

java - 如何检查字符串是否包含列表中的子字符串?