1

java.util.AbstractList に「Itr」という名前の InnerClass があることは知っています。「expectedModCount」という名前のフィールドと、「checkForComodification」という名前のメソッドがあります。イテレータがコレクションを更新する場合、このメソッドは ConcurrentModificationException をスローします なぜ Java 言語がこのように設計されたのか知りたいですか? このようにする目的は何ですか。

どうも !

4

4 に答える 4

8

Java言語がこのように設計された理由を知りたいですか?

それは言語の一部ではありません。コレクションフレームワークの一部です。

基本的に、コレクションを繰り返し処理していて、それが変更された場合に何が起こるかについて、非常に一般的な仕様を作成するのは比較的困難です。リストのいくつかのルールを決定することは確かにできますが、(たとえば) マップのエントリ セットについてはどうでしょうか? エントリを追加または削除すると、内部順序が完全に変更される可能性があります。その場合、どうしたいですか?

于 2012-07-23T09:32:56.297 に答える
3

コレクションの変更が許可されていた場合、多くの問題が発生します。

要素が 0 から 4 のリストがあるとします。イテレータには 3 が渡されます。

 
|0|1|2|3|4|
イテレータ^

ここで、先頭に要素を追加します

 
|5|0|1|2|3|4|
イテレータ^?^

イテレータは今何を返す必要がありますか?

  • それは変更前の次の要素だったので、4 を返す可能性があります。
  • これは、イテレータが指していたインデックスにあるため、3 を返す可能性があります。

リストの実装によっては、これらのそれぞれが複雑さを追加し、パフォーマンスが低下します。コレクションの変更を禁止することで、正しい動作と付随する複雑さを指定することを回避できます。

于 2012-07-23T09:43:02.520 に答える
1

コレクションを繰り返し処理し、 を使用して変更することができますIterator(これはこれを行う標準的な方法です)。

これに関する詳細については、ループ内で削除するときに ConcurrentModificationException を回避して、コレクションを反復処理するを参照してください。

于 2012-07-23T09:37:29.967 に答える
1

コレクションが 1 つのスレッドによって変更され、別のスレッドがそれを読み取っている場合、競合状態と呼ばれるものが発生する可能性があります。これを回避するとパフォーマンスが低下しますが、予期しない/望ましくない結果を回避できます (たとえば、そのようなチェックがない場合、ArrayList 内の既存の要素をスキップまたは 2 回読み取る可能性があります)。

于 2012-07-23T09:40:15.230 に答える