【发布时间】:2016-12-09 12:24:56
【问题描述】:
我尝试了以下两种情况:
ArrayList arrayList = new ArrayList();
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
String value = (String) iterator.next();
System.out.println("---->" + value);
if (value.equals("1")) {
arrayList.remove(0);
}
}
第一个场景输出是:
---->1
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at Test.main(Test.java:83)
ConcurrentModificationException 异常可能是因为我试图修改集合而我仍在迭代它。
在第二种情况下,我将if() 条件从value.equals("1") 更改为value.equals("2"),并且程序没有抛出任何错误。
ArrayList arrayList = new ArrayList();
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
String value = (String) iterator.next();
System.out.println("---->" + value);
if (value.equals("2")) {
arrayList.remove(0);
}
}
第二个场景输出是:
---->1
---->2
在这两种情况下,我的程序都没有到达第三个元素(值:3)。
你能帮我理解这个问题吗?
【问题讨论】:
-
arrayList.remove(0);是您的问题。请改用iterator对象来删除元素。 -
@Jonk 我知道它会通过调用迭代器对象的 remove 方法来避免错误。但我想了解为什么在第二种情况下没有达到第三个元素?
-
这是因为在索引 0 处删除后元素
3变为第二个,因此已被视为迭代;它不会抛出异常,因为不能保证快速失败的行为 - 请参阅可能的重复项。
标签: java arraylist collections