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

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

DDD
リリース: 2024-12-08 14:15:14
オリジナル
279 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート