ホームページ >Java >&#&チュートリアル >Java で ConcurrentModificationException に対処するにはどうすればよいですか?
Java で ConcurrentModificationException に対処するにはどうすればよいですか?
Java プログラミングでは、ConcurrentModificationException は非常に一般的な例外です。この例外は、反復子 (Iterator) または拡張 for ループ (foreach) を使用してコレクションをループするときによく発生します。この記事では、この例外の原因と解決策を紹介します。
反復子を使用してコレクションを走査するときに、走査中にコレクション内の要素が変更 (追加、削除など) された場合ConcurrentModificationException 例外が発生しました。この例外の理由は、Iterator の next() メソッドが呼び出されるときに、現在の modCount が ExpectedModCount と等しいかどうかを比較するためです。等しくない場合は、反復プロセス中にコレクションが変更されたことを意味します。コレクション要素に追加または削除すると、modCount の値は変更されますが、expectedModCount の値は変更されないため、2 つが等しくなくなり、ConcurrentModificationException 例外がスローされます。
ConcurrentModificationException の発生を回避するには、コレクションを走査するときにコレクション要素を変更しないようにする必要があります。一般的に、解決策は 3 つあります。
##(1) 通常の for ループを使用して走査する 通常の for ループを使用して走査することは、反復子を使用する代わりに添字を使用してコレクション内の要素を操作できるため、実行可能な解決策です。ただし、この方法は使用するのが難しく、大量のコードが必要になります。 サンプル コード:List<String> list = new ArrayList<>(); for(int i = 0; i < list.size(); i++) { String str = list.get(i); // 对str进行操作 }(2) イテレーターの削除メソッドを使用するコレクションの走査中に要素を変更する必要がある場合は、イテレーターの削除メソッドを使用できます。手術。このメソッドを使用すると、ConcurrentModificationException をスローせずに、next() メソッドへの最後の呼び出しによって返された要素を削除できます。 サンプル コード:
List<String> list = new ArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { it.remove(); } }(3) CopyOnWriteArrayList の使用CopyOnWriteArrayList はスレッドセーフなコレクションです。その読み取りと書き込みの分離機能により、コレクションに追加するときに、要素を削除しても、トラバース中のスレッドには影響しません。要素が変更されると、CopyOnWriteArrayList はデータの新しいコピーを作成し、それを操作します。したがって、CopyOnWriteArrayList は、読み取りが多く書き込みが少ないシナリオに適しています。 サンプル コード:
List<String> list = new CopyOnWriteArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { list.remove(str); } }上記は、ConcurrentModificationException 例外を回避するために使用する一般的なメソッドです。実際のプログラミングでは、プログラムの堅牢性と効率性を確保するために、実際の状況に基づいてメソッドを選択する必要があります。
以上がJava で ConcurrentModificationException に対処するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。