HashMap — 해시 테이블 기반 매핑
HashMap — 해시 테이블 기반 매핑
HashMap<K, V>는 Map 인터페이스의 해시 테이블 기반 구현으로, 모든 선택적 맵 연산을 제공하고 null 값과 null 키를 허용해요. Hashtable과 거의 동등하지만 동기화되지 않고 null을 허용한다는 차이가 있어요. 이 클래스는 맵의 순서를 보장하지 않으며, 순서가 시간이 지나도 일정하다는 보장도 없어요.
본문
public class HashMap<K, V> extends AbstractMap<K, V>
implements Map<K, V>, Cloneable, Serializable
해시 함수가 요소를 버킷에 잘 분산한다고 가정하면 기본 연산(get, put)은 상수 시간에 수행돼요. 컬렉션 뷰를 순회하는 시간은 인스턴스의 "용량"(버킷 수)과 크기(키-값 매핑 수)에 비례해요. 따라서 순회 성능이 중요하다면 초기 용량을 너무 크게(또는 로드 팩터를 너무 작게) 잡지 않는 게 중요해요.
HashMap 인스턴스의 성능에 영향을 주는 두 파라미터는 초기 용량(initial capacity) 과 로드 팩터(load factor) 예요. 로드 팩터는 해시 테이블이 자동으로 용량을 늘리기 전까지 채워질 수 있는 정도예요. 항목 수가 로드 팩터와 현재 용량의 곱을 초과하면 해시 테이블은 리해시(재구성)되어 약 두 배의 버킷을 갖게 돼요. 기본 로드 팩터(.75)는 시간과 공간 비용 사이에서 좋은 균형을 제공해요.
생성자
HashMap(int initialCapacity, float loadFactor)— 지정된 초기 용량과 로드 팩터로 빈 맵을 만들어요.HashMap(int initialCapacity)— 지정된 초기 용량과 기본 로드 팩터(0.75)로 만들어요.HashMap()— 기본 초기 용량(16)과 기본 로드 팩터(0.75)로 만들어요.HashMap(Map<? extends K, ? extends V> m)— 지정된 맵과 같은 매핑을 가진 새 맵을 만들어요.
기본 연산
size()— 키-값 매핑 수를 반환해요.isEmpty()— 매핑이 없으면true를 반환해요.get(Object key)— 지정된 키에 매핑된 값을 반환하고, 매핑이 없으면null을 반환해요. 반환값이null이라고 해서 반드시 매핑이 없다는 뜻은 아니어요(키가null에 매핑될 수도 있어요). 두 경우를 구분하려면containsKey를 써요.put(K key, V value)— 지정된 키에 값을 연결해요. 이전에 매핑이 있었다면 기존 값을 교체해요.putAll(Map m)— 지정된 맵의 모든 매핑을 복사해요.remove(Object key)— 지정된 키의 매핑을 제거하고 이전 값을 반환해요.clear()— 모든 매핑을 제거해요.containsKey(Object key)/containsValue(Object value)— 키나 값의 존재 여부를 검사해요.
컬렉션 뷰
keySet()— 키들의Set뷰를 반환해요. 세트는 맵에 의해 백업되므로 맵 변경이 세트에 반영되고 역방향도 마찬가지예요.values()— 값들의Collection뷰를 반환해요.entrySet()— 매핑들의Set뷰를 반환해요.
계산·병합 연산
computeIfAbsent(K key, Function mappingFunction)— 키가 값과 연결돼 있지 않으면(또는null로 매핑돼 있으면) 매핑 함수로 값을 계산해 넣어요. 예:map.computeIfAbsent(key, k -> new Value(f(k)))computeIfPresent(K key, BiFunction remappingFunction)— 값이 존재하고null이 아니면 새 매핑을 계산해요.compute(K key, BiFunction remappingFunction)— 키와 현재 값을 바탕으로 매핑을 계산해요.merge(K key, V value, BiFunction remappingFunction)— 키에 값이 없으면 주어진 값과 연결하고, 있으면 리매핑 함수 결과로 교체(결과가null이면 제거)해요.
기타
clone()— 이 인스턴스의 얕은 복사본을 반환해요(키와 값 자체는 복제되지 않아요).newHashMap(int numMappings)— 기대 매핑 수에 알맞은 빈 맵을 만들어요. 기본 로드 팩터 0.75를 사용하고, 크기 재조정 없이 기대 매핑 수를 담을 수 있을 만큼 초기 용량이 충분해요.