在这种情况下会发生什么是您正在删除第二个列表元素。
List<String> list = new ArrayList<String>
(Arrays.asList("noob1", "noob2", "noob3", "noob4"));
System.out.println(list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String str = iterator.next();
if (str.equals("noob3")) {
System.out.println("Checking "+str);
list.remove(str);
}
}
System.out.println(list);
印刷
[noob1, noob2, noob3, noob4]
Checking noob1
Checking noob2
Checking noob3
[noob1, noob2, noob4]
通过删除倒数第二个元素,您将大小减少到您已迭代的元素数量。
// from ArrayList.Itr
public boolean hasNext() {
return cursor != size;
}
这会导致循环在执行并发修改检查之前提前退出next()
。如果您删除任何其他元素next()
,则会调用并获得 CME。
顺便说一句,也绕过检查的东西是
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String str = iterator.next();
System.out.println("Checking "+str);
if (str.equals("noob2")) {
list.remove("noob1");
list.remove("noob3");
}
}
只要集合的大小与它所达到的索引相同,就不会执行检查。