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进行操作 }
List<String> list = new ArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { it.remove(); } }
List<String> list = new CopyOnWriteArrayList<>(); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next(); if(str.equals("hello")) { list.remove(str); } }
以上がJava で ConcurrentModificationException に対処するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。