맵과 해싱 - java.util.HashMap

이현빈·2025년 2월 26일
0
post-thumbnail

1. java.util.HashMap 개괄

Java 언어에서의 해싱 방법 - 체인법

체인법(chaining) 개요

  • 해시 테이블의 버킷은 배열, 각 버킷에 저장할 데이터는 연결리스트의 노드로 구현
    : 해시 코드가 동일하여 데이터를 저장할 버킷이 중복될 때, 해당 버킷에서 두 데이터를 연결 리스트의 형태로 저장하는 방식
  • Java 언어에서는 HashMap의 구현에 활용됨
  • 범위 검색 이외의 일반적인 검색 상황에서 뛰어난 성능을 보임
    : 키값을 변환한 해시코드를 이용하여 해시 테이블에 저장된 데이터에 대해 임의 접근이 가능하기 때문

체인법 사용 시 데이터 탐색 과정

  1. 검색하려는 값의 키로 해시 함수를 호출
  2. 해시함수의 계산 결과(= 해시 코드)로 해시 테이블에서 검색하려는 값이 저장된 버킷을 탐색
  3. 2.에서 찾은 버킷의 연결 리스트에서 검색한 키와 일치하는 데이터를 탐색

java.util.HashMap 기본 설명

  • 체인법을 사용하여 Map 인터페이스를 구현한 컬렉션 클래스
    : key-value 쌍을 저장하는 Entry란 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언
    (key, value 타입은 각각 Object 타입)
  • 이전의 java.util.HashTable 클래스를 대체
    (Vector 클래스와 ArrayList의 관계와 동일)

연관된 인터페이스/클래스

java.util.HashMap의 상위 인터페이스/클래스

상위 인터페이스

cf) java.lang.Cloneablejava.io.Serializable는 마커 인터페이스

java.util.Map

  • 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하기 위한 인터페이스

java.util.Entry

  • Map에 저장되는 key-value 쌍을 다루기 위해 정의된 내부 인터페이스
  • Map을 구현하는 클래스는 Map.Entry 인터페이스도 필수적으로 구현

java.lang.Clonable

  • 이 인터페이스를 구현한 클래스의 인스턴스는 Object clone() 메서드를 통해 복제될 수 있음

java.io.Serializable

  • 이 인터페이스를 구현한 클래스의 인스턴스는 직렬화될 수 있음

상위 클래스

java.util.AbstractMap

  • Map 인터페이스를 구현하는 컬렉션 클래스의 기본 골격을 제공하기 위한 추상 클래스

java.util.AbstractMap.SimpleImmutableEntry

  • 단순히 Entry 인터페이스에 정의된 메서드를 구현한 AbstractMap 추상 클래스의 스태틱 내부 클래스
  • 멤버변수를 변경할 수 없는 불변 객체이므로 setValue() 호출 시 UnsupportedOperationException 발생
  • Serializable 인터페이스의 구현 클래스이므로 직렬화 가능

java.util.AbstractMap.SimpleEntry

  • 단순히 Entry 인터페이스에 정의된 메서드를 구현한 AbstractMap 추상 클래스의 스태틱 내부 클래스
  • Serializable 인터페이스의 구현 클래스이므로 직렬화 가능

java.util.HashMap의 주요 내부 클래스

cf) java.util.HashSet의 내부 클래스들까지 포함한 상속/구현 관계는 아래와 같으나,
Map의 구성 요소(키, 값, 엔트리)와 연관된 내부 클래스를 중심으로 간략히 정리

데이터 노드 클래스

java.util.HashMap.Node

  • Entry 인터페이스의 메서드를 키와 값을 저장하는 노드 형태로 구현한 HashMap 클래스의 스태틱 내부 클래스

java.util.HashMap.TreeNode

  • Entry 인터페이스의 메서드를 키와 값을 저장하는 노드 형태로 구현한 HashMap 클래스의 스태틱 내부 클래스
  • java.util.LinkedHashMap 클래스에 포함된 Entry 인터페이스의 구현 클래스를 상속받아 java.util.Node의 기능을 확장

컬렉션 단위 키/값 저장용 클래스

java.util.HashMap.EntrySet

  • HashMap에 저장된 키와 값을 키-값 쌍인 엔트리 형태로 저장하는 Set 클래스
  • entrySet() 메서드를 구현하는 용도로 사용
  • 일반적인 집합 클래스와는 달리 데이터의 추가는 불가능

java.util.HashMap.KeySet

  • HashMap의 키들을 저장하기 위한 Set 클래스
  • keySet() 메서드를 구현하는 용도로 사용
  • 일반적인 집합 클래스와는 달리 데이터의 추가는 불가능

java.util.HashMap.Values

  • HashMap의 값들을 저장하기 위한 Set 클래스
  • values() 메서드를 구현하는 용도로 사용
  • 일반적인 컬렉션 클래스와는 달리 데이터의 추가는 불가능

2. java.util.HashMap의 주요 메서드

cf) java.util.HashMap의 모든 메서드는 여기에서 확인 가능

생성자

HashMap()

  • HashMap 객체를 생성하는 기본 생성자

HashMap(int initialCapacity, float loadFactor)

  • 지정된 초기용량과 load factor의 HashMap 객체를 생성

HashMap(int initialCapacity)

  • 지정된 값을 초기 용량으로 삼는 HashMap 객체를 생성

HashMap(Map m)

  • 지정된 Map의 모든 요소를 포함하는 HashMap을 생성

키/값 포함 여부 확인

boolean containsKey(Object key)

  • HashMap에 지정된 키가 포함되어 있는지를 확인
  • 포함되어 있으면 true, 포함되어 있지 않으면 false를 반환

boolean containsValue(Object value)

  • HashMap에 지정된 값이 포함되어 있는지를 확인
  • 포함되어 있으면 true, 포함되어 있지 않으면 false를 반환

데이터 추가/삭제/변경

데이터 추가

Object put(Object key, Object value)

  • 지정된 키와 값을 HashMap에 저장
  • 키 객체의 값이 중복되면 값을 갱신

void putAll(Map m)

  • Map에 저장된 모든 요소를 HashMap에 저장

데이터 삭제

Object remove(Object key)

  • HashMap에서 지정된 키 객체에 매핑된 값을 제거

데이터 변경

Object replace(Object key, Object value)

  • 지정된 키에 매핑되는 값을 지정된 객체로 대체

boolean replace(Object key, Object oldValue, Object newValue)

  • HashMap에 지정된 키와 oldValue 객체의 쌍이 존재하면 oldValue를 newValue로 교체

데이터 접근

객체 단위 조회

Object get(Object key)

  • 지정된 키에 대응되는 값을 반환하되, 지정한 키가 HashMap에 존재하지 않으면 null을 반환

Object getOrDefault(Object key, Object defaultValue)

  • 지정된 키에 대응되는 값을 반환하되, 지정한 키가 HashMap에 존재하지 않으면 기본값으로 지정된 객체를 반환

컬렉션 단위 조회

Set entrySet()

  • HashMap에 저장된 키와 값을 키-값 쌍인 엔트리 형태로 Set에 저장해서 반환

Set keySet()

  • HashMap에 저장된 모든 키를 Set의 형태로 반환

Collection values()

  • HashMap에 저장된 모든 값을 Collection의 형태로 반환

Reference

0개의 댓글