Map — 키-값 매핑
Map — 키-값 매핑
Map<K, V>는 키를 값에 매핑하는 객체예요. 맵은 중복 키를 가질 수 없고, 각 키는 많아야 하나의 값에 매핑될 수 있어요. 이 인터페이스는 완전히 추상 클래스였던 Dictionary 클래스를 대체해요.
본문
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/entry는 null 키/값을 허용하지 않아요.
동등성과 해시
equals(Object)는 m1.entrySet().equals(m2.entrySet())일 때 두 맵이 같은 매핑을 나타내는 것으로 보고 true를 반환해요. hashCode()는 entrySet()의 각 항목 해시코드의 합이에요.