在這種情況下會發生什麼,您將刪除第二個列表元素。
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