java.util.ConcurrentModificationExceptionが問題
地図収集プロセス、および、時には処理フィルターにキーの地図コレクションを削除する必要がある場合。
たとえば、次のキー値が決定され、必要がフィルタリング(キー値が「KEY1」ではない)要求を満足しません。
次のように図1に示すように、実行コードが与えられます。
パブリック クラスTraverseMapTestDelete { 公共 静的 ボイドメイン(文字列[]引数){ 地図 <文字列、文字列>マップ= 新しい HashMapの<文字列、文字列> (); map.put( "キー1"、 "VALUE1" )。 map.put( "KEY2"、 "値2" )。 map.put( "KEY3"、 "値3" ); 用(文字列キー:map.keySet()){ 場合( "KEY1" .equals(キー)){ map.remove(キー)。 } } map.forEach((キー、値) - >値)); } }
次のような情報を与えられました:
スレッド「メイン」の例外java.utilの。ConcurrentModificationExceptionが :java.util.HashMapを$ HashIterator.nextNode(HashMap.javaで 1445 ) のjava.util.HashMap $ KeyIterator.next(HashMap.java:で 1469 ) com.miracle.luna.lambda.TraverseMapTestDelete.mainで(TraverseMapTestDelete。 Javaの: 19)
図2は、正しいコードが(イテレータを使用して地図を横切る)以下の通りであります:
/ ** *ミラクルルナON 2020年3月17日によって作成 * / パブリック クラスTraverseMapDelete { 公共 静的 ボイドメイン(文字列[]引数){ 地図 <文字列、文字列>マップ= 新しい新規のHashMap <文字列、文字列> (); 地図.put( "キー1"、 "VALUE1" ); map.put( "KEY2"、 "値2" ); map.put( "KEY3"、 "値3" ); // トラバーサルの間に、いくつかのキーを削除しました-value需要が)このトラバーサルを使用することができる のMap.Entryのイテレータ<<文字列、文字列>>イテレータ= EnumMap.entrySet()イテレータを(); しばらく(iterator.hasNext()){ Map.Entry<文字列、文字列>エントリ= iterator.next()。 もし( "KEY1" .equals(entry.getKey())){ iterator.remove()。 } } map.forEach((キー、値) - >のSystem.out.println(キー+ ":" + 値))。 } }
[ご注意!!!]ここでなければなりません )(iterator.remove; 彼らは右を通過すると削除キーを、
むしろ使用するよりも 、map.remove(entry.getKeyを())または map.remove(entry.getKey()、entry.getValue( ))。
次のように実行結果は以下のとおりです。
KEY2:値2
KEY3:VALUE3
参考ブログ:https://www.cnblogs.com/hanmou/p/4156052.html