【问题标题】:Iteration,concurrentModifcationException in JavaJava中的迭代,并发修改异常
【发布时间】:2010-07-20 10:47:40
【问题描述】:

我正在对 ArrayList 使用增强的 for 循环,并希望删除一些包含特定值的元素。

当我尝试这样做时,我得到了上述异常。我环顾四周,似乎在修改集合时使用增强的 for 循环是一个坏主意。我该怎么办?

感谢您的帮助。

【问题讨论】:

    标签: java exception iteration


    【解决方案1】:

    您可以保留要删除的项目列表,然后在循环完成后调用 removeAll。

    Vector toRemove=new Vector();
    for (Object o: array){
      if(remove(o))  toRemove.add(o);
    }
    array.removeAll(o);
    

    【讨论】:

    • 两件事。您应该使用 ArrayList 而不是 Vector(您不需要 Vector 提供的同步)。另外,请注意,对于不同的集合实现,此方法稍好/稍差。 ArrayList 就是其中之一,就好像您要移除一堆项目一样,它可以在一次操作中重新打包它们,而不是每次移除项目时(O(n) 而不是 O(n^2))。
    【解决方案2】:

    你应该为集合获取一个迭代器,遍历它并在你想删除一个元素时调用迭代器上的 remove() 方法。请注意,并非所有 Iterator 实现都支持 remove(),它是一个可选方法!

    for(Iterator it = collection.iterator(); it.hasNext();) {
      Object element = it.next();
      if(.. should remove element ..)
        it.remove()
    }
    

    【讨论】:

    • 请记住,这种方法对于 ArrayLists 可能会相当慢,尽管由于不需要“查找”要删除的项目(例如 LinkedList 和 Sets),使用其他一些方法可能会稍微快一些)。
    【解决方案3】:

    您无法使用增强的 for 循环来执行此操作,因为您无权访问正在使用的 Iterator。您需要使用常规 for 循环并通过 Iterator.remove() 删除 ArrayList 的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多