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);
}
}학습 팁
Guava의 Maps.newHashMapWithExpectedSize(n)은 로드 팩터를 고려한 최적 초기 용량을 계산해줍니다.
주의할 점
new HashMap(1000)은 1000개를 저장할 수 있다는 의미가 아닙니다. 로드 팩터(0.75)를 고려하면 750개에서 리해싱됩니다.
자주 묻는 질문
컬렉션 사이징 최적화란 무엇인가요?
컬렉션 초기 용량 설정으로 불필요한 재할당을 방지합니다.
컬렉션 사이징 최적화 학습 시 주의할 점은 무엇인가요?
new HashMap (1000) 은 1000개를 저장할 수 있다는 의미가 아닙니다. 로드 팩터(0.75)를 고려하면 750개에서 리해싱됩니다.