Map인터페이스를 구현한 하위 클래스들 HashMap과 LinkedHashMap과 TreeMap은 분명한 몇 가지 차이가 있다.
Map 인터페이스를 구현하였으므로, Key - Value Store형태로 저장하여, 사용할 수 있다는 공통점이 있다.
다음과 같은 차이점이 있다.
<입력되는 순서로 저장 보장>
HashMap
들어 간 순서로 저장되지 않으며, 출력되는 순서가 일치하는 것을 보장하지 않는다.
HashTable
들어 간 순서로 저장되지 않으며, 출력되는 순서가 일치하는 것을 보장하지 않는다.
LinkedHashMap
들어 간 순서대로 저장되어 출력되는 순서가 일치하는 것을 보장한다.
TreeMap
들어 간 순서대로 저장되지 않으며, 정렬된 순서로 저장되어 출력된다.
public static void main(String[] args) { HashMap<Integer, String> hashMap = new HashMap<Integer, String>(); Hashtable<Integer, String> hashTable = new Hashtable<Integer, String>(); TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>(); LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>(); // HashMap, TreeMap, LinkedHashMap에 각각 2 -> 3 -> 1 순서대로 입력함 hashMap.put(2, String.valueOf(2)); hashTable.put(2, String.valueOf(2)); treeMap.put(2, String.valueOf(2)); linkedHashMap.put(2, String.valueOf(2)); hashMap.put(3, String.valueOf(3)); hashTable.put(3, String.valueOf(3)); treeMap.put(3, String.valueOf(3)); linkedHashMap.put(3, String.valueOf(3)); hashMap.put(1, String.valueOf(1)); hashTable.put(1, String.valueOf(1)); treeMap.put(1, String.valueOf(1)); linkedHashMap.put(1, String.valueOf(1)); // 출력 System.out.println("--HashMap--"); for(Entry<Integer, String> entry : hashMap.entrySet()){ Integer key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); } System.out.println("--HashTable--"); for(Entry<Integer, String> entry : hashTable.entrySet()){ Integer key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); } System.out.println("--TreeMap--"); for(Entry<Integer, String> entry : treeMap.entrySet()){ Integer key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); } System.out.println("--LinkedHashMap--"); for(Entry<Integer, String> entry : linkedHashMap.entrySet()){ Integer key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); } } | cs |
--HashMap-- 1 : 1 2 : 2 3 : 3 --HashTable-- 3 : 3 2 : 2 1 : 1 --TreeMap-- 1 : 1 2 : 2 3 : 3 --LinkedHashMap-- 2 : 2 3 : 3 1 : 1 | cs |
위의 결과로 봤을 때 HashMap과 HashTable 역시 정렬되는 것 같지만, 하나는 오름차순, 하나는 내림차순으로 정렬된다. 그냥 맘 편하게 안 된다고 생각하자.
<구조 및 성능>
HashMap
검색성능 O(1) 시간복잡도, 해시테이블과 비교하여 동기화(Synchronized) 지원하지 않지만 성능은 더 빠름
HashTable
검색성능 O(1) 시간복잡도, 해시맵과 비교하여 동기화(Synchronized) 지원하지만 성능은 더 느림
LinkedHashMap
검색성능 O(1) 시간복잡도, 더블링크드리스트 자료구조로 이루어짐
TreeMap
검색성능 O(log(n)) 시간복잡도, Red Black Tree 자료구조로 이루어짐
<Null Keys and values>
HashMap
하나의 null Key와 여러 개의 null values를 허용한다.
HashTable
null Key 또는 null Value를 허용하지 않는다. => Null Pointer Exception 발생
LinkedHashMap
하나의 null Key와 여러 개의 null values를 허용한다.
TreeMap
null Key 또는 null Value를 허용하지 않는다. => Null Pointer Exception 발생
'JAVA' 카테고리의 다른 글
자바 예외 처리 (0) | 2015.11.21 |
---|---|
GC(Garbage Collection)의 대상은 누구인가? (0) | 2015.11.10 |
Comparable 인터페이스에 대한 이해 (0) | 2015.11.07 |
자바 Garbage Collection(GC) 튜닝 (0) | 2015.11.07 |
자바의 시간 API (0) | 2015.11.07 |