HashMap
vs Hashtable
- unsynchronized 되있다는 것과 null을 key와 value로 가질 수 있다는 점만 빼면
Hashtable
과 같다. - xxx 내부 구현에 차이 있음
Hashtable
is now considered obsolete
- synchronization을 제공하고 싶으면
Hashtable
대신concurrentHashMap
을 사용하자
- 일정한 순서를 보장하지 않음
- Hash Function이 잘 구현 되어있다면
- basic operations (get and put)에대한 O(1) performance를 제공함
- Iteration의 시간복잡도는 O(N + C)임
- N - 전체 원소 수
- C - capacity
- capacity - bucket의 용량 (default - 16)
- load factor - bucket을 늘리는 시점을 결정하는 비율 (default - 0.75)
- 즉, HashMap을 default 로 생성한다면 12개의 bucket이 채워진 시점에 capacity를 늘림 (약 2배)
- load faction의 threshold를 넘어가는 시점에
rehash
가 발생한다.
rehash
- 내부 테이블의 구조를 새로운 capacity로 재 설정하는 일
- 모든 원소에 대한 hashcode( )%capacity를 다시 계산하고 공간 배치를 다시함
- HashMap의 기본 구현은 synchronized 되어 있지 않음
Collections.synchronizedMap
메서드로 래핑 하여 synchronized 기능을 제공할 수 있음- → 대신
ConcurrentHashMap
이 더 좋은 선택임
- fail-fast한 iterator를 제공함
HashMap
의 FieldsTreeMap
은- Red-Black tree 기반의
NavigableMap
(SortedMap
) 구현체임
- key의 natural order (Comparable) 혹은 생성자로 부터 전달받은 Comparator에 의해 정렬됨
containsKey
,get
,put
andremove
연산에 대한 log(n)의 시간 복잡도를 제공함

- 역시 synchronized 되어 있지 않으며 동기화 기능을 사용하고 싶다면
Collections.synchronizedSortedMap
으로 래핑하여야함
- 역시 fail-fast한 iterator 제공함
- Comparator를 가져야함
- Key가 Comparable을 구현하였다면 그것을 사용함
- 그렇지 않다면 생성자에 Key의 comparator를 제공해야함
- 때문에
null
을 key 값으로 활용할 수 없음 (value 는 가능)
HashMap, HashSet은 HashTable의 구현을 바탕으로 함
→ 내부적으로 equals 메소드를 기반으로함 → null을 key로 가질 수 있음 (항상 null 체크를 함)
반면 TreeMap, TreeSet은 RbTree의 구현을 바탕으로함
→ 내부적으로 compareTo 메소드를 기반으로함 → null을 key로 가질 수 없음