java.util.ConcurrentModificationExceptionが問題

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

 

おすすめ

転載: www.cnblogs.com/miracle-luna/p/12508303.html