ホームページ >Java >&#&チュートリアル >反復中にコレクションから要素を削除するときに ConcurrentModificationException を回避するにはどうすればよいですか?

反復中にコレクションから要素を削除するときに ConcurrentModificationException を回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-08 14:15:14284ブラウズ

How to Avoid ConcurrentModificationException When Removing Elements from a Collection During Iteration?

反復中にコレクション要素を削除する際の ConcurrentModificationException の回避

概要

同時実行中のコレクションの変更それを反復処理すると、次のような予期しない動作が発生する可能性があります。 ConcurrentModificationException。この問題を回避するには、さまざまなアプローチを使用できます。

アプローチ 1: コレクションのコピーを反復処理する

1 つの方法は、コレクションのコピーを作成して反復処理することです。元のコレクションの代わりにそのコピーを使用します。これにより、反復中に元のコレクションが変更されなくなります。

例:

List<Foo> fooListCopy = new ArrayList<>(fooList);
for (Foo foo : fooListCopy) {
    // Modify the actual fooList
}

アプローチ 2: コレクション反復子の使用

もう 1 つのアプローチは、元のコレクションによって提供されるイテレータを使用することです。イテレーターは、コレクションを走査し、反復中に要素を削除するための安全な方法を提供します。

例:

Iterator<Foo> itr = fooList.iterator();
while (itr.hasNext()) {
    // Modify the actual fooList using itr.remove()
}

JDK 8 またはHigher

  • removeIf: このメソッドは述語を受け取り、その述語を満たすすべての要素をコレクションから削除します。
  • Streams: ストリームを使用すると、コレクションをフィルタリングして、必要な要素を含む新しいコレクションを作成し、元のコレクションをフィルタリングされたコレクション。

選択に関する考慮事項

最適なアプローチは、特定のシナリオによって異なります。

  • 収集および削除: 任意のコレクションで動作しますが、2 つ必要です
  • ListIterator: リストに対して効率的で、追加操作と削除操作をサポートします。
  • Iterator: 削除操作のみをサポートします。
  • JDK 8 ストリーム: 1 回かつ効率的に反復します要素をフィルターします。
  • サブリストまたはサブセット: 並べ替えられたコレクション内の連続する要素を効率的に削除します。

追加の考慮事項:

  • コピー手法は安全ですが、コピーにはコストがかかります。コレクション。
  • 反復子のアプローチは、すべての反復子の実装でサポートされているわけではありません。
  • JDK 8 ストリームはコレクションへの参照を変更し、再割り当てが必要です。

以上が反復中にコレクションから要素を削除するときに ConcurrentModificationException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。