제가 JAVA 의 Map
(HashMap)을 사용하다가 ConcurrentModificationException
가 발생한 경우 중 Map.keySet()
과 관련된 경우를 공유합니다.
public class Main {
public static void main(String[] args) {
Map<String, Integer> testMap = new HashMap<>();
testMap.put("k1", 1);
testMap.put("k2", 2);
testMap.put("k3", 3);
for (String key : testMap.keySet()) { // ConcurrentModificationException 발생
Integer value = testMap.remove(key);
System.out.println("value = " + value);
}
}
}
위와 같은 상황에서 ConcurrentModificationException
가 발생했습니다.
testMap.keySet()
이 for문에서 참조되면서 동시에 그 안에서 testMap.remove(key)
로 해당 key와 value가 삭제되어서 발생하는 문제로 보입니다.
public class Main {
public static void main(String[] args) {
Map<String, Integer> testMap = new HashMap<>();
testMap.put("k1", 1);
testMap.put("k2", 2);
testMap.put("k3", 3);
for (String key : Set.copyOf(testMap.keySet())) { // keySet을 복사
Integer value = testMap.remove(key);
System.out.println("value = " + value);
}
}
}
문제를 해결하기 위해서 위와 같이 testMap.keySet()
을 그대로 사용하지 않고 copy 해서 사용하면 문제를 해결할 수 있다.