PHpullh
학습 라이브러리/Java/HashMap 내부 구조

JAVA · 컬렉션

HashMap 내부 구조

HashMap의 해시 버킷, 트리 변환, 로드 팩터를 이해합니다.

컬렉션고급HashMap해시버킷로드팩터

핵심 설명

HashMap의 해시 버킷, 트리 변환, 로드 팩터를 이해합니다.

Java code

import java.util.*;

public class HashMapInternal {
    public static void main(String[] args) {
        // 기본: 초기 용량 16, 로드팩터 0.75
        HashMap<String, Integer> map = new HashMap<>();
        // 용량 지정 (2의 거듭제곱으로 반올림)
        HashMap<String, Integer> sized = new HashMap<>(32, 0.75f);

        // put: O(1) 평균
        map.put("Alice", 90);
        map.put("Bob", 85);

        // 해시 충돌 시: LinkedList -> TreeMap (8개 초과)
        // 내부 동작:
        // 1. key.hashCode() 계산
        // 2. hash를 버킷 인덱스로 변환
        // 3. 같은 버킷이면 equals()로 비교
        // 4. 충돌 8개 초과 -> Red-Black Tree로 변환

        // 중요: hashCode()와 equals() 계약
        // equals()가 true면 hashCode()도 같아야 함

        // Java 9+ 팩토리
        Map<String, Integer> immutable = Map.of("a", 1, "b", 2);
        Map<String, Integer> copied = Map.copyOf(map);

        // 유용한 메서드
        map.getOrDefault("없는키", 0);
        map.putIfAbsent("Alice", 100); // 이미 있으면 무시
        map.computeIfAbsent("Charlie", k -> k.length());
        map.merge("Alice", 10, Integer::sum); // 90 + 10 = 100
    }
}

학습 팁

예상 원소 수를 알면 new HashMap(expectedSize / 0.75 + 1)로 초기화하면 리해싱을 방지합니다.

주의할 점

가변 객체를 키로 사용하면 해시값이 변경되어 데이터를 찾을 수 없게 됩니다. 키는 반드시 불변이어야 합니다.

자주 묻는 질문

HashMap 내부 구조란 무엇인가요?

HashMap 의 해시 버킷, 트리 변환, 로드 팩터를 이해합니다.

HashMap 내부 구조 학습 시 주의할 점은 무엇인가요?

가변 객체를 키로 사용하면 해시값이 변경되어 데이터를 찾을 수 없게 됩니다. 키는 반드시 불변이어야 합니다.