java.util.ConcurrentModificationException problème

java.util.ConcurrentModificationException problème


 

Lorsque le processus de collecte Carte, et ont parfois besoin de retirer le filtre traitement de la collection Carte des clés.

Par exemple: La valeur de la clé est déterminée, ne doit pas répondre à la demande (valeur de clé n'est pas « key1 ») filtrer.

 

1, le code d'exécution est donnée comme suit:

publique  classe TraverseMapTestDelete {
     publique  statique  vide principale (String [] args) { 
        Carte <String, String> map = nouvelle HashMap <String, String> (); 
        map.put ( "key1", "valeur1" ); 
        map.put ( "key2", "valeur2" ); 
        map.put ( "key3", "value3" ); 

        pour (String key: map.keySet ()) {
             si ( "key1" equals (clé)) { 
                map.remove (clé); 
            } 
        } 

        Map.forEach ((clé, valeur) ->valeur)); 
    } 
}

Compte tenu des informations comme suit:

Exception dans le thread "principal" 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, le code correct est le suivant (avec l'utilisation d'un itérateur traversent la carte):

/ ** 
 * Créé par le Miracle Luna 2020/3/17 
 * / 
publique  classe TraverseMapDelete {
     publics  statiques  vides principaux (String [] args) { 
        la carte <String, String> Plan = new new HashMap <String, String> (); 
        Carte .put ( "key1", "valeur1" ); 
        map.put ( "key2", "valeur2" ); 
        map.put ( "key3", "valeur3" ); 

        // lors de la traversée, ont supprimé certaines clés la demande -value, peut utiliser cette traversal) 
        le Iterator <de Map.Entry <String, String = >> Iterator EnumMap.entrySet () iterator () .;
        tandis que (iterator.hasNext ()) {
            Map.Entry<String, String> entrée = iterator.next ();
            si ( "key1" equals (entry.getKey ())) {
                 Iterator.remove (); 
            } 
        } 

        Map.forEach ((clé, valeur) -> System.out.println (touche + ":" + valeur)); 
    } 
}

[Note! ! ! ] Ici doit   Iterator.remove ();   clésuppression comme ils traversent le droit,

Plutôt que d' utiliser  map.remove (entry.getKey ()); ou   map.remove (entry.getKey (), entry.getValue ( ));

 

les résultats d'exécution sont les suivants:

key2: valeur2 
key3: value3

 

Blog de référence : https://www.cnblogs.com/hanmou/p/4156052.html

 

Je suppose que tu aimes

Origine www.cnblogs.com/miracle-luna/p/12508303.html
conseillé
Classement