>>457
コンパイルするとこうなるっしょ

Iterator<String> it = list.iterator();

while (it.hasNext()) {
  String str = it.next();

  if ("X".equals(str)) {
    list.remove(str);
  }
}

next()の処理で変更されたかがチェックされている
hasNextはこうなっている

public boolean hasNext() {
  return cursor != size;
}

"D"のときに値を1個削除するとcursor == sizeとなってnextが呼ばれずに処理が終了する
なので、"C"のときには値を2個削除すればエラーにならないって感じ