반응형
문제: 일반적인 순회에서 요소 제거
HashMap
을 for-each
루프나 keySet()
등을 통해 순회하면서 remove()
메서드를 직접 호출하면, HashMap
의 내부 구조가 변경되므로 ConcurrentModificationException
이 발생합니다.
HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);
// 순회 중 요소를 직접 제거하려고 시도
for (String key : map.keySet()) {
if (map.get(key) < 30) {
map.remove(key); // 예외 발생: ConcurrentModificationException
}
}
해결 방법: Iterator를 사용한 안전한 제거
Iterator
는 remove()
메서드를 제공하여 순회 중 안전하게 요소를 제거할 수 있습니다.
HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
if (entry.getValue() < 30) { // 값이 30보다 작은 경우 제거
iterator.remove(); // 안전하게 요소 제거
}
}
// 결과 출력
System.out.println(map); // {Alice=30, Charlie=35}
왜 Iterator를 사용해야 할까?
- 동기화 문제 방지:
Iterator
는 내부적으로 fail-fast 메커니즘을 사용해 동기화 문제를 방지.remove()
호출 시HashMap
의 상태를 안전하게 업데이트.
- 구조적 변경 감지:
HashMap
은 구조적 변경(요소 추가/삭제 등)이 발생할 때 즉시 예외를 던져 무결성을 유지.Iterator
는 이러한 변경을 감지하고 안전한 방식으로 처리.
- 성능:
Iterator
를 통해 요소를 제거하면 내부 버킷(bucket)과 해싱 구조를 최적화하며 동작.
요약
- 요소(element):
HashMap
의 각 키-값 쌍. - 순회 중 제거 문제:
HashMap
의 구조 변경 시ConcurrentModificationException
이 발생. - 해결책:
Iterator
의remove()
메서드를 사용해 안전하게 요소를 제거.
결론: Iterator
는 구조적 무결성을 유지하면서 순회 중 요소를 안전하게 제거하는 가장 표준적인 방법입니다.
반응형
'프로그래밍 > java' 카테고리의 다른 글
HashMap을 탐색(순회) 방법 (0) | 2025.01.02 |
---|---|
hashset, treeset 비교 (0) | 2024.12.22 |
hashmap vs treemap 비교 (1) | 2024.12.21 |
[java]keystore 경로, list 확인 (0) | 2023.02.02 |
이클립스 주요 단축키 (0) | 2022.12.30 |