체인법(chaining) 개요
- 해시 테이블의 버킷은 배열, 각 버킷에 저장할 데이터는 연결리스트의 노드로 구현
: 해시 코드가 동일하여 데이터를 저장할 버킷이 중복될 때, 해당 버킷에서 두 데이터를 연결 리스트의 형태로 저장하는 방식- Java 언어에서는
HashMap
의 구현에 활용됨- 범위 검색 이외의 일반적인 검색 상황에서 뛰어난 성능을 보임
: 키값을 변환한 해시코드를 이용하여 해시 테이블에 저장된 데이터에 대해 임의 접근이 가능하기 때문
체인법 사용 시 데이터 탐색 과정
- 검색하려는 값의 키로 해시 함수를 호출
- 해시함수의 계산 결과(= 해시 코드)로 해시 테이블에서 검색하려는 값이 저장된 버킷을 탐색
- 2.에서 찾은 버킷의 연결 리스트에서 검색한 키와 일치하는 데이터를 탐색
- 체인법을 사용하여 Map 인터페이스를 구현한 컬렉션 클래스
: key-value 쌍을 저장하는 Entry란 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언
(key, value 타입은 각각 Object 타입)- 이전의
java.util.HashTable
클래스를 대체
(Vector
클래스와ArrayList
의 관계와 동일)
상위 인터페이스
cf) java.lang.Cloneable
와 java.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
인터페이스의 구현 클래스이므로 직렬화 가능
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()
메서드를 구현하는 용도로 사용- 일반적인 컬렉션 클래스와는 달리 데이터의 추가는 불가능
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의 형태로 반환