Explaintion dlaczego to spowodowane ConcurrentModificationException
map.remove(k);
map.put(x, value);
dla każdej pętli również wewnętrznie utworzyć iterator z entrySet
z map
. Podczas iteracji na mapie zmodyfikowałeś strukturę mapy poprzez ponowne umieszczenie wartości na mapie (map.put(x,value)
), co powoduje, że ta ConcurrentModificationException
.
Jest jeszcze dobrze wyjaśnione documentation -
W iteratorów zwracanych przez wszystkich z tej klasy jest „widok zbiórki metody” to fail-szybko: jeśli mapa jest strukturalnie zmodyfikowane w dowolnym czasie po iterator jest tworzony w dowolny sposób z wyjątkiem iteracyjnej metody iteratora, iterator wygeneruje wyjątek ConcurrentModificationEx.W związku z tym, w obliczu równoczesnej modyfikacji , iterator ulega awarii szybko i czysto, zamiast ryzykować arbitralne, niedeterministyczne zachowanie w nieokreślonym czasie. w przyszłości.
Jak rozwiązać ten -
należy zmienić zmianą struktury tej mapy podczas iteracji, można wstawić te wartości później, jak utrzymać tymczasową mapę i dodać ten jeden raz iteracji się skończył praca.
Map<Long, Integer> tempMap = new HashMap<>();
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
tempMap.put(x, value);
}
map.putApp(tempMap);
@ZouZou I googled o to i znalazłem to pytanie na pierwszym miejscu. Google to za mało, potrzebna jest też treść :-) – peterh
Czy możesz dołączyć kod do iteratora. Powyższy kod z pewnością da wyjątek modyfikacji równoczesnej. Przechodzisz przez zestaw kluczy, a także zmieniasz mapę w tym samym czasie. To przepis na katastrofę. – SamDJava
Dodano odpowiedź poniżej z przykładowym kodem. – SamDJava