Java 当移除内部foreach时,我们需要后退吗
以以下Java代码为例:Java 当移除内部foreach时,我们需要后退吗,java,foreach,Java,Foreach,以以下Java代码为例: for (ContactsReduced curContact : allcontacts) { .......... allcontacts.remove(curContact); } 我是根据条件a删除的,foreach是否会错过下一个项目,我们是否需要退一步(以某种方式)?在迭代集合时,绝对建议不要篡改集合。我不确定Java是否允许它;它可能引发异常。我知道C#确实…迭代器将因ConcurrentModificationException而失败。这就是集合框
for (ContactsReduced curContact : allcontacts) {
..........
allcontacts.remove(curContact);
}
我是根据条件a删除的,foreach是否会错过下一个项目,我们是否需要退一步(以某种方式)?在迭代集合时,绝对建议不要篡改集合。我不确定Java是否允许它;它可能引发异常。我知道C#确实…迭代器将因ConcurrentModificationException而失败。这就是集合框架的设计方式。除了少数集合(如
java.util.concurrent
中的集合)之外,大多数集合都会破坏代码,不支持在迭代集合时修改集合
有几个选择:
- 获取并显式使用迭代器(对集合调用
),而不是增强的for循环,然后调用iterator()
删除项iterator.remove()
- 使用普通for循环,在移除后向前移动和后退,或者从末端向后移动
- 维护要删除的项目的单独列表,然后在迭代后删除它们
可能值得一提的是,这种“特性”被称为快速失效。阅读相关的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)