3

次のように、イテレータを使用して ArrayList をトラバースしているこのコードがあります。

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
  Element element = iterator.next();
  iterator.remove();
  handle(element)
}

'handle(Element element)' は次のようになります。

ListIterator iterator = list.listiterator();
iterator.add(element);

iterator最初のメソッドが新しく追加された要素で更新されないため、これにより ConcurrentModificationException が発生します。

私は現在、CopyOnWriteArrayListを使用してこれを解決しましたが、これらはパフォーマンスに非常にコストがかかります。これを修正するより良い方法はありますか?

前もって感謝します!

(注:この例は意味がありませんが、私が直面していることを説明するために作成されました)


なぜ私がこれをしているのかを説明しようとします:

  • メインクラスに実行する必要がある「コマンド」のリストがあります

  • これらのコマンドを反復して 1 つずつ実行し、実行時にリストから削除する while ループ (例のコード 1) があります。

  • コマンドの実行中、このコマンドは、メイン クラスに保存されているリストに新しいコマンドを追加できます。(これは実際にはもう少し複雑です。コマンドを処理するとクライアントからの応答が要求され、クライアントはコマンドで応答し、保存されたリストに追加されます)。

4

1 に答える 1

5

前述の要件が与えられた場合、簡単な解決策は、ではなくQueue( javadocList )を使用することです。

メインクラスに実行する必要がある「コマンド」のリストがあります

は一連Queueのコマンドを表すことができます。

これらのコマンドを反復して 1 つずつ実行し、実行時にリストから削除する while ループ (例のコード 1) があります。

a に相当するのは、 orなどQueueを繰り返し呼び出して、 から最初のコマンドを取得および削除することです。が空になるまでこれを繰り返します。remove()poll()QueueQueue

これにはIterator.

コマンドの実行中、このコマンドは、メイン クラスに保存されているリストに新しいコマンドを追加できます。

これは、 を呼び出すadd()offer()、 にコマンドを追加することで実行できますQueue


Queueさまざまなプロパティを持つさまざまな実装がたくさんあることに注意してください。

  • 有限または無限のサイズのキュー
  • ブロックするキューまたはブロックしないキュー
  • 単純な FIFO キューと LIFO キューまたはプライオリティ キューの比較
于 2016-04-10T01:55:53.647 に答える