본문 바로가기
컴퓨터공학/자료구조

HashMap vs HashTable vsTreeMap 그리고 HashSet

by Daniel.kwak 2019. 2. 19.

HashMap은 자바 프로그래밍에서 널리 쓰이고 있으며 기술면접에도 단골질문으로 나온다. 

HashMap과 HashTable , HashSet을 정리해둔다.





HashTable은 Map 인터페이스의 implementaion을 기반으로 한다.  이 implementaion은 Map의 모든 기능을 제공하며, Null 키값과 Null 밸류값을 허용한다. (HashMap은 거칠게? HashTable과 같지만, 비동기화이며, Null을 허용한다) 
HashMap은 Map의 순서를 보장하지 않으며 이 순서가 계속 유지되는것 또한 보장하지 않는다. 

Hash Function을 사용하여 get과 put에는 O(1)의 시간복잡도가 소요된다. 
HashMap은 초기 Capacity보다 입력값이 많아질 경우 동적으로 size가 늘어나는 associated array이다.

HashMap의 성능에 영향을 미치는 두 가지 Parameter가 있다. 바로 Initial Capacity와 load factor인데, Initial Capacity는 HashTable의 Bucket 개수이며 HashTable이 처음 생성될 때 초기화된다. load factor는 HashTable이 가득 찼을 때 얼마나 Capacity를 증가시킬지에 대한 값이다.
HashTable의 항목 수가 load factor와 current capacity의 곱을 초과하는 경우 HashTable은 rehash 되며, 약 두배의 용량을 가지게 된다. 
따라서 많은 Mapping 값을 저장하고 싶은 경우 초기 Capacity를 충분히 잡는것이 Rehashing 방지에 좋다.

HashMap은 동기화를 지원하지 않는 클래스이다. 복수의 쓰레드가 HashMap에 접근하여 modify할 경우 외부적으로 동기화 이슈를 해결해야만 한다. 




이 클래스는 키를 값에 매핑하는 hash table을 구현한다. non-null 인 어떠한 object도 키와 값이 될 수 있다. 
성공적으로 저장하고 값을 가져오기 위해서 키는 hashCode와 equal 메소드를 사용해야만 한다. 








HashSet은 HashMap에 근거하여 Set Interface를 implements하였다. Set의 순서는 정렬되어 있지 않으며, 계속 같은 순서를 유지하는것을 보장하지 않는다. Null 요소를 허용한다.  기본 add, remove, contains에 대해 상수 시간의 시간복잡도를 가지며, hashFunction에 의해 동작한다. 순회가 중요하다면 Capacity 사이즈를 너무 높게 잡지 않도록 한다. 동기화를 지원하지 않으며 마찬가지로 외부에서 동기화 이슈를 해결해야 한다.