Java では、 foreach ループを使用してコレクションを反復処理するときに、コレクションに対して remove を呼び出すことは有効ですか? たとえば、次のようになります。
List<String> names = ....
for (String name : names) {
// Do something
names.remove(name).
}
補足として、まだ繰り返し処理されていない項目を削除することは合法でしょうか? たとえば、
//Assume that the names list as duplicate entries
List<String> names = ....
for (String name : names) {
// Do something
while (names.remove(name));
}
ベストアンサー1
コレクションを反復処理しながら安全に削除するには、Iterator を使用する必要があります。
例えば:
List<String> names = ....
Iterator<String> i = names.iterator();
while (i.hasNext()) {
String s = i.next(); // must be called before you can call i.remove()
// Do something
i.remove();
}
からJava ドキュメント:
このクラスの iterator メソッドと listIterator メソッドによって返されるイテレータは、フェイルファストです。つまり、イテレータの作成後に、イテレータ自身の remove メソッドまたは add メソッド以外の方法でリストの構造が変更された場合、イテレータは ConcurrentModificationException をスローします。したがって、同時変更が発生した場合、イテレータは、将来の不確定な時点で任意の非決定的な動作を起こすリスクを冒すのではなく、迅速かつクリーンに失敗します。
おそらく多くの初心者にとって不明瞭なのは、for/foreach構造を使用してリストを反復処理すると、必然的にアクセスできない反復子が暗黙的に作成されるという事実です。この情報はここ