5

次のような foreach ループで繰り返しているときに、リストから要素を削除できないのはなぜだろうと思っていました。

List<Object> objects = new ArrayList<Object>();
Object one = new Object();
Object two = new Object();
Object three = new Object(); 

objects.add(one);
objects.add(two);
objects.add(three);

次に、次のような要素を削除します。

foreach(Object o : objects){
  objects.remove(three); //I know that o is my current object
}

foreach-loop では、ループ キューに「まだ」あるオブジェクトを削除できないようです。私は正しいですか?

そして、なぜ for-int-loop はこれを気にしないのでしょうか? このループでは、まだループ内にあるオブジェクトを簡単に削除できます。

ありがとう

4

4 に答える 4

2

Javaに関する限り、答えはjavadocにあります(私の強調):

このクラスの iterator および listIterator メソッドによって返される反復子はフェイルファストです。反復子の作成後にリストが構造的に変更された場合、反復子自体の remove または add メソッド以外の方法で、反復子は ConcurrentModificationException をスローします。したがって、同時変更に直面した場合、反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗します。

于 2013-05-27T23:07:12.110 に答える
1

Java の foreach ループで remove を呼び出す を参照してください。通常は Iterator を使用し、さらに要素がある場合は hasNext で確認します。

于 2013-05-27T23:07:02.720 に答える