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(2String.valueOf(2));
        hashTable.put(2String.valueOf(2));
        treeMap.put(2String.valueOf(2));
        linkedHashMap.put(2String.valueOf(2));
        
        hashMap.put(3String.valueOf(3));
        hashTable.put(3String.valueOf(3));
        treeMap.put(3String.valueOf(3));
        linkedHashMap.put(3String.valueOf(3));
        
        hashMap.put(1String.valueOf(1));
        hashTable.put(1String.valueOf(1));
        treeMap.put(1String.valueOf(1));
        linkedHashMap.put(1String.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
2
3
--HashTable--
3
2
1
--TreeMap--
1
2
3
--LinkedHashMap--
2
3
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
Posted by slender ankles
,