Javaのイテレータについて知りたいです。同時変更例外をスローするように設計されているのはなぜですか? C++ STL では、コンテナーを反復処理して、必要に応じて変更を加えることができますが、なぜ Java ではそれができないのでしょうか?
編集:質問を修正しました。誤ってフレーム化されました。
なぜこのように設計されているかを説明する代わりに、次の小さな秘密を紹介します。
反復中にリストから削除すると、同時例外が発生します。反復中に反復子を使用して削除すると、他の理由で同時例外が発生する可能性があります。
このようなもの
for(Iterator<?> iter = list.getIterator(); iter.hasNext(); )
{
MyClass c = iter.getNext();
if( //i need to remove this instance)
iter.remove(iter);
}
呼び出しをラップするsynchronized
か、変数を次のようにマークするvolatile
と、オブジェクトへのアクセスが同期され、複数のソースから同時にアクセスできなくなるため、同時変更を回避するのに役立ちます。
または [COW リスト] を使用 ( http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html )
今日、SO にリンクする方法がわかりません....