1. ホーム
  2. java

[解決済み] Javaでforeachループでremoveを呼び出す [重複]。

2022-03-15 11:48:56

質問

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));
}

解決方法は?

コレクションを繰り返しながら安全に削除するには、イテレータを使用する必要があります。

例えば

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 ドキュメント :

このクラスのイテレータと listIterator が返すイテレータは メソッドはフェールファストです。 イテレータが作成された後、そのイテレータを使用する以外の何らかの方法で イテレータ自身の remove メソッドや add メソッドを使用すると、イテレータは ConcurrentModificationException。このように、同時多発的な イテレータは、迅速かつきれいに失敗します。 任意の非決定的な動作をする危険性があります。 を使用します。

おそらく多くの初心者にとって不明なのは、for/foreach構文を使ってリストを反復処理すると、必然的にアクセス不能なイテレータが暗黙のうちに生成されるという事実でしょう。この情報は以下の通りです。 こちら