Explaintion perché è causato ConcurrentModificationException
map.remove(k);
map.put(x, value);
per ogni ciclo anche creare internamente un iteratore di entrySet
di map
. Durante l'iterazione sulla mappa, hai modificato la struttura della mappa riportando il valore sulla mappa (map.put(x,value)
) che causa questo ConcurrentModificationException
.
E 'ancora ben spiegato in documentation -
Gli iteratori restituito da tutti di questa classe "Vista la raccolta metodi" sono fail-fast: se la mappa è strutturalmente modificato in qualsiasi momento dopo l'iteratore viene creato, in qualsiasi modo tranne che attraverso il metodo di rimozione dello stesso iteratore , l'iteratore genererà un valore di ConcurrentModificationException .Pertanto, a fronte della simultanea modifica di , l'iteratore non riesce in modo rapido e pulito, piuttosto che a rischio di comportamento arbitrario non deterministico in un tempo indeterminato in futuro.
Come risolvere questo -
è necessario modificare il cambiamento della struttura di questa mappa, mentre l'iterazione, è possibile inserire questi valori in seguito, come tenere una mappa temporanea e aggiungere questo una volta di iterazione è finito il suo lavoro.
Map<Long, Integer> tempMap = new HashMap<>();
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
tempMap.put(x, value);
}
map.putApp(tempMap);
fonte
2013-05-19 17:10:18
@ZouZou Ho cercato su google per questo e ho trovato questa domanda sul primo posto. Google non è sufficiente, è necessario anche il contenuto :-) – peterh
Puoi allegare il codice per l'iteratore. Il codice sopra fornirà certamente un'eccezione di modifica simultanea. Stai iterando attraverso il keyset e modificando la mappa allo stesso tempo. Questa è una ricetta per il disastro. – SamDJava
Aggiunta una risposta qui sotto con un codice di esempio. – SamDJava