Java 当移除内部foreach时,我们需要后退吗

Java 当移除内部foreach时,我们需要后退吗,java,foreach,Java,Foreach,以以下Java代码为例: for (ContactsReduced curContact : allcontacts) { .......... allcontacts.remove(curContact); } 我是根据条件a删除的,foreach是否会错过下一个项目,我们是否需要退一步(以某种方式)?在迭代集合时,绝对建议不要篡改集合。我不确定Java是否允许它;它可能引发异常。我知道C#确实…迭代器将因ConcurrentModificationException而失败。这就是集合框

以以下Java代码为例:

for (ContactsReduced curContact : allcontacts) {
 ..........
 allcontacts.remove(curContact);
}

我是根据条件a删除的,foreach是否会错过下一个项目,我们是否需要退一步(以某种方式)?

在迭代集合时,绝对建议不要篡改集合。我不确定Java是否允许它;它可能引发异常。我知道C#确实…

迭代器将因ConcurrentModificationException而失败。这就是集合框架的设计方式。

除了少数集合(如
java.util.concurrent
中的集合)之外,大多数集合都会破坏代码,不支持在迭代集合时修改集合

有几个选择:

  • 获取并显式使用迭代器(对集合调用
    iterator()
    ),而不是增强的for循环,然后调用
    iterator.remove()
    删除项
  • 使用普通for循环,在移除后向前移动和后退,或者从末端向后移动
  • 维护要删除的项目的单独列表,然后在迭代后删除它们

查看

当需要删除当前元素时,请使用迭代器而不是for-each构造。for-each构造隐藏迭代器,因此不能调用remove。因此,for-each构造不可用于过滤

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法


可能值得一提的是,这种“特性”被称为快速失效。阅读相关的Javadoc时,它应该有助于导航。
List<Integer> al = new ArrayList<Integer>();
for(int i=0;i<10;i++){
  al.add(i);
}
for(Integer x:al){
  al.remove(x);
  System.out.println(al);
}
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    at test.Main.main(Main.java:17)