포스트

HashMap 합치기 — putAll vs merge

키 충돌 시 덮어쓸지 결합할지 — putAll과 Java 8 merge의 차이

HashMap 합치기 — putAll vs merge

두 Map을 한 Map으로 합칠 때, 키가 겹치면 어떻게 처리할지가 핵심이다.

putAll — 단순 덮어쓰기

1
2
3
4
5
Map<String, Integer> map1 = new HashMap<>(Map.of("Apple", 1000, "Banana", 2000));
Map<String, Integer> map2 = new HashMap<>(Map.of("Apple", 4000, "Tomato", 5000));

map1.putAll(map2);
// {Apple=4000, Banana=2000, Tomato=5000} — 기존 값 덮어씀

겹친 키의 기존 값은 사라진다.

merge — 충돌 시 결합 함수 지정 (Java 8+)

1
2
map2.forEach((key, value) -> map1.merge(key, value, (v1, v2) -> v1 + v2));
// {Apple=5000, Banana=2000, Tomato=5000} — 충돌 시 합산

merge(key, value, remappingFunction):

  • 키가 없으면 그대로 put
  • 있으면 remappingFunction(기존, 신규) 결과로 대체
  • 결과가 null이면 키 제거

결합 함수만 바꾸면 합·max·문자열 join 등 자유롭게 처리할 수 있다.

어느 쪽을 쓸지

  • 단순 덮어쓰기면 putAll이 명확하다.
  • 키 충돌 시 의미 있는 결합(합산, 리스트 누적 등)이 필요하면 merge.
  • 새 결과 Map을 만들고 싶다면 Stream.concat(...).collect(toMap(k, v, merger))가 자연스럽다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.