この状況で何が起こるかは、2番目のリスト要素を削除することです。
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]
最後から2番目の要素を削除することにより、サイズを繰り返した要素の数に減らしました。
// 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");
}
}
コレクションのサイズが最大のインデックスと同じである限り、チェックは実行されません。