在这种情况下会发生什么,您将删除第二个列表元素。
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()
进行并发modifcation检查提前退出。如果你删除任何其他元素next()
被调用,你会得到一个CME。
BTW一些东西,也绕过检查
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");
}
}
只要集合的大小是一样的,因为它是到指数,不进行检查。
什么异常? –
java.util.ConcurrentModificationException – NINCOMPOOP
但它如何取决于“if”条件? – NINCOMPOOP