Map — 키-값 매핑

Map — 키-값 매핑

Map<K, V>키를 값에 매핑하는 객체예요. 맵은 중복 키를 가질 수 없고, 각 키는 많아야 하나의 값에 매핑될 수 있어요. 이 인터페이스는 완전히 추상 클래스였던 Dictionary 클래스를 대체해요.

출처: Java API Reference

본문

public interface Map<K, V>

Map 인터페이스는 세 가지 컬렉션 뷰를 제공해요. 맵 내용을 키 집합, 값 컬렉션, 또는 키-값 매핑 집합으로 볼 수 있어요. 맵 순서는 뷰의 반복자가 요소를 반환하는 순서로 정의돼요. TreeMap처럼 만남 순서를 보장하는 구현도 있고, HashMap처럼 보장하지 않는 구현도 있어요.

가변 객체를 맵 키로 쓸 때는 주의해야 해요. 객체가 키로 있는 동안 equals 비교에 영향을 주는 방식으로 값이 바뀌면 맵 동작이 정의되지 않아요. 맵이 자기 자신을 키로 포함하는 것은 허용되지 않아요.

일반적인 맵 구현 클래스는 void 생성자(빈 맵)와 Map 단일 인자 생성자(같은 매핑의 새 맵) 두 가지 "표준" 생성자를 제공해야 해요. 이 인터페이스의 파괴적 메서드들(수정하는 메서드)은 맵이 연산을 지원하지 않으면 UnsupportedOperationException을 던지도록 명세돼요.

기본 연산

  • size() / isEmpty() / clear() — 기본 연산이에요.
  • containsKey(Object) / containsValue(Object) — 키/값 존재 여부를 검사해요.
  • get(Object key) — 키에 매핑된 값을 반환하고, 없으면 null을 반환해요. containsKey로 구분할 수 있어요.
  • put(K key, V value) — 키에 값을 연결하고 이전 값을 반환해요.
  • remove(Object key) — 키의 매핑을 제거하고 이전 값을 반환해요.
  • putAll(Map) — 모든 매핑을 복사해요.

컬렉션 뷰

  • keySet() — 키들의 Set 뷰를 반환해요.
  • values() — 값들의 Collection 뷰를 반환해요.
  • entrySet()Map.Entry 매핑들의 Set 뷰를 반환해요.
  • forEach(BiConsumer) — 각 항목에 동작을 수행해요.
  • replaceAll(BiFunction) — 각 항목의 값을 함수 결과로 교체해요.

조건부/계산 연산

  • getOrDefault(Object, V) — 키에 매핑이 없으면 기본값을 반환해요.
  • putIfAbsent(K, V) — 키에 값이 없을 때만 연결해요.
  • remove(Object, Object) / replace(K, V, V) / replace(K, V) — 키가 현재 지정 값에 매핑돼 있을 때만 제거/교체해요.
  • computeIfAbsent(K, Function) — 값이 없으면 함수로 계산해 넣어요.
  • computeIfPresent(K, BiFunction) — 값이 존재할 때 새 매핑을 계산해요.
  • compute(K, BiFunction) — 키와 현재 값으로 매핑을 계산해요.
  • merge(K, V, BiFunction) — 값이 없으면 연결하고 있으면 리매핑 결과로 교체(결과가 null이면 제거)해요.

팩토리

of(...) — 지정 키-값 쌍을 가진 수정 불가능한 맵을 반환해요(Map.of()부터 10쌍까지, ofEntries 포함). entry(K, V)는 수정 불가능한 Map.Entry를, copyOf(Map)은 주어진 맵의 수정 불가능한 사본을 반환해요. of/entrynull 키/값을 허용하지 않아요.

동등성과 해시

equals(Object)m1.entrySet().equals(m2.entrySet())일 때 두 맵이 같은 매핑을 나타내는 것으로 보고 true를 반환해요. hashCode()entrySet()의 각 항목 해시코드의 합이에요.

더 알아보기 (Learn more)