반응형
HashMap Iterator Removal

문제: 일반적인 순회에서 요소 제거

HashMapfor-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를 사용한 안전한 제거

Iteratorremove() 메서드를 제공하여 순회 중 안전하게 요소를 제거할 수 있습니다.

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이 발생.
  • 해결책: Iteratorremove() 메서드를 사용해 안전하게 요소를 제거.

결론: 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

+ Recent posts