PHpullh
학습 라이브러리/Java/컬렉션 사이징 최적화

JAVA · 성능/JVM

컬렉션 사이징 최적화

컬렉션 초기 용량 설정으로 불필요한 재할당을 방지합니다.

성능/JVM중급컬렉션초기용량사이징성능

핵심 설명

컬렉션 초기 용량 설정으로 불필요한 재할당을 방지합니다.

Java code

import java.util.*;

public class CollectionSizing {
    public static void main(String[] args) {
        int expectedSize = 1000;

        // ArrayList — 기본 용량 10, 1.5배씩 증가
        // 1000개: 10->15->22->33->...->1076 (약 17번 재할당)
        List<String> badList = new ArrayList<>();       // 기본 10
        List<String> goodList = new ArrayList<>(expectedSize); // 1000

        // HashMap — 기본 용량 16, 로드팩터 0.75
        // 1000개 저장: 1000/0.75 = 1334 이상 필요
        Map<String, String> badMap = new HashMap<>();
        Map<String, String> goodMap = new HashMap<>(
            (int)(expectedSize / 0.75) + 1); // 1334

        // HashSet — HashMap 기반
        Set<String> goodSet = new HashSet<>(
            (int)(expectedSize / 0.75) + 1);

        // 성능 비교
        long start = System.nanoTime();
        for (int i = 0; i < expectedSize; i++) {
            badList.add("item" + i);
        }
        long badTime = System.nanoTime() - start;

        start = System.nanoTime();
        for (int i = 0; i < expectedSize; i++) {
            goodList.add("item" + i);
        }
        long goodTime = System.nanoTime() - start;

        System.out.printf("기본 용량: %dns%n", badTime);
        System.out.printf("최적 용량: %dns%n", goodTime);
        System.out.printf("개선: %.1f%%%n",
            (1.0 - (double)goodTime / badTime) * 100);
    }
}

학습 팁

GuavaMaps.newHashMapWithExpectedSize(n)은 로드 팩터를 고려한 최적 초기 용량을 계산해줍니다.

주의할 점

new HashMap(1000)은 1000개를 저장할 수 있다는 의미가 아닙니다. 로드 팩터(0.75)를 고려하면 750개에서 리해싱됩니다.

자주 묻는 질문

컬렉션 사이징 최적화란 무엇인가요?

컬렉션 초기 용량 설정으로 불필요한 재할당을 방지합니다.

컬렉션 사이징 최적화 학습 시 주의할 점은 무엇인가요?

new HashMap (1000) 은 1000개를 저장할 수 있다는 의미가 아닙니다. 로드 팩터(0.75)를 고려하면 750개에서 리해싱됩니다.