【问题标题】:when remove an element of ArrayList from inside for each loop. its break the loop当从内部为每个循环删除 ArrayList 的元素时。它打破了循环
【发布时间】:2014-03-11 06:05:44
【问题描述】:

当从foreach 循环内部删除ArrayList 的元素时。它打破了循环。
抛出 ConcurrentModificationException
我的问题是为什么它会打破循环。

代码。

ArrayList gStudyLst=getLst();
    int recordCount=0;
    for(String study : gStudyLst){
        if(++recordCount < 10){
            if(generateFile(study)){
                gStudyLst.remove(study); // there its break throw ConcurrentModificationException
            }else{
                System.out.println("File not generated"):
                gStudyLst.clear();
                return false;
                }
            }
        }else{
            return true;
        }   
    }

【问题讨论】:

  • 是的,您需要使用 Iterator.remove() 或索引删除。

标签: java arraylist foreach


【解决方案1】:

使用Iterator 来避免ConcurrentModificationException

Iterator 接口的 Java 文档说:

迭代器允许调用者从底层移除元素 迭代期间的集合,具有明确定义的语义。

这是一个例子:

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
    String str = iter.next();

    if (someCondition)
        iter.remove();
}

【讨论】:

  • iter.remove() 可以从 myArrayList 中删除元素吗?
  • @Pawanmishra :可以。
【解决方案2】:

这是因为“这个类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外的任何方式,迭代器将抛出 ConcurrentModificationException。因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意、非确定性行为的风险。"

详情请见http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

【讨论】:

    【解决方案3】:

    for 每个循环仅用于遍历数组列表的值。如果要删除循环内的值,请使用迭代器,如下所示

    for (Iterator iterator = gStudyLst.iterator(); iterator.hasNext();) {
                String study = (String) iterator.next();
    
    }
    

    【讨论】:

      【解决方案4】:

      增强的 for 语句具有以下形式:

      for ( Type Identifier : Expression ) Statement

      增强的 for 语句相当于基本的 for 语句,形式如下:

      for (I iter = Expression.iterator(); iter.hasNext(); ) { Type Identifier = iter.next(); Statement } 来自 javaDoc:

      此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外的任何方式,迭代器将抛出一个 ConcurrentModificationException

      因此,不要使用forEach,而是使用Iterater 并使用迭代器自己的删除或添加方法修改您的列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-06
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 2015-09-11
        • 2021-08-24
        相关资源
        最近更新 更多