Explaintion почему это вызвало ConcurrentModificationException
map.remove(k);
map.put(x, value);
для каждого цикла также внутренне создают итератор entrySet
от map
. Повторяя по карте, вы изменили структуру карты, снова добавив значение к карте (map.put(x,value)
), которые вызывают это ConcurrentModificationException
.
Это даже хорошо объяснен в documentation -
Итераторов возвращенный все этот класс «вид коллекции методов» является отказоустойчивость быстро: если карта конструктивно изменена в любом время после итератора создается любым способом, кроме как через собственный метод удаления итератора, итератор будет вызывать ConcurrentModificationException.Таким образом, в результате одновременной модификации итератор быстро и чисто, а не , рискует произвольным, недетерминированным поведением в неопределенное время в будущем.
Как решить эту проблему -
вы должны изменить изменить структуру этой карты в то время как итерация, вы можете вставить эти значения позже, как сохранить временную карту и добавить этот раз итерация закончена его работа.
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 Я искал для этого google и нашел этот вопрос на первом месте. Google недостаточно, контент также нужен :-) – peterh
Может ли u подключить код для итератора. Вышеприведенный код, безусловно, даст вам одновременное изменение Exception. Вы выполняете итерацию через набор ключей, а также изменяете карту одновременно. Это рецепт катастрофы. – SamDJava
Добавлен ответ ниже с образцом кода. – SamDJava