HashMap — 해시 테이블 기반 매핑

HashMap — 해시 테이블 기반 매핑

HashMap<K, V>Map 인터페이스의 해시 테이블 기반 구현으로, 모든 선택적 맵 연산을 제공하고 null 값과 null 키를 허용해요. Hashtable과 거의 동등하지만 동기화되지 않고 null을 허용한다는 차이가 있어요. 이 클래스는 맵의 순서를 보장하지 않으며, 순서가 시간이 지나도 일정하다는 보장도 없어요.

출처: Java API Reference

본문

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를 사용하고, 크기 재조정 없이 기대 매핑 수를 담을 수 있을 만큼 초기 용량이 충분해요.

더 알아보기 (Learn more)