본문 바로가기
깨알정보

자바의 자료구조 Map (HashMap, TreeMap, HashTable, LinkedHash Map)

by 에레메쓰 2021. 3. 22.
반응형

Map은 'Key' 'Value'를 동시에 넣는 배열입니다. 즉, 'Key'를 통해 데이터를  가져옵니다. Map을 정의할 때, HashMap <key 변수 자료형, Value 변수 자료형> map이름=new HashMap<>();의 형태로 정의하는데 HashMap 이외 HashTable, TreeMap, LinkedhasMap으로 정의가 가능합니다. 우선 예제를 통해 Map을 어떻게 사용하는지 알아보도록 해요.

 

 

HashMap


HashMap<Integer, String> map = new HashMap<>();
        
        map.put(1, "가나다");
        map.put(2, "라마바");
        
System.out.println(map.get(1));

 

map.put(key,value);의 구조로 정의합니다. 'key' 또는 'value' 데이터를 넣지 않으면 형태에 맞지 않기 때문에 에러가 발생돼요. 정의 또는 넣은 데이터를 출력해야 되는데 그때 사용되는 게 'get'입니다. 'map.get(key)'의 형태로 출력하고 키가 1인 데이터를 가져오도록 하면 "가나다"가 출력됩니다.

 

HashMap<Integer, String> map = new HashMap<>();
        
        map.put(1, "가나다");
        map.put(2, "라마바");
        
        map.remove(1);
        
   System.out.println(map.get(1));
   System.out.println(map.size());
}

 

이후 map에 있는 데이터를 삭제할 때는 'map.remove(key)'로 내용을 지울 수 있고 'map.size()'를 이용하여 현재 map에 저장된 데이터의 크기도 알 수 있습니다. 

 

HashMap<Integer, String> map = new HashMap<>();
        
        map.put(1, "가나다");
        map.put(1, "라마바");
        
   System.out.println(map.get(1));
}

 

여기서 주의해야될 점은, key 값(1)이 중복되면 처음에 정의한 "가나다"는 삭제되고 이후 정의된 "라마바"로 데이터가 삽입됩니다. 데이터가 많아지면 어떻게 출력되는지 확인해보도록 하죠.

 

 HashMap<Integer, Integer> map = new HashMap<>();
        
        map.put(50, 1);
        map.put(10, 2);
        map.put(10, 2);
        map.put(40, 3);
        map.put(40, 3);
        map.put(2, 4);
        map.put(70, 5);
        map.put(9, 6);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
            
        }

HashMap-예제-결과값-출력-이미지
HashMap-결과값-출력

 

보시다시피 중복된 값은 이후 정의된 map(key.value); 데이터가 출력되고 'map.put' 순서가 아닌 무작위로 데이터가 출력되는 것을 볼 수 있습니다.

 

 

TreeMap, HashTable, LinkedHashMap


TreeMap는 'key'의 데이터가 자동으로 정렬됨에 따라 처리하는 속도가 다른 Map보다 다소 오래 걸립니다. 'key'  값에 따라 자동으로 작은 순서대로 정렬되어 있는 모습을 볼 수 있습니다.

  TreeMap<Integer, Integer> map = new TreeMap<>();
        
        map.put(50, 1);
        map.put(10, 2);
        map.put(10, 2);
        map.put(40, 3);
        map.put(40, 3);
        map.put(2, 4);
        map.put(70, 5);
        map.put(9, 6);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
}

 

TreeMap-예제-결과값-출력-이미지
TreeMap-결과값-출력

 

 

HashTable은 'key' 'value' 값에 Null 사용이 불가능하고 동기화가 지원됩니다.

Hashtable<Integer, Integer> map = new Hashtable<>();
        
        map.put(50, 1);
        map.put(10, 2);
        map.put(40, 3);
        map.put(2, 4);
        map.put(70, 5);
        map.put(9, 6);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }

HashTable-예제-결과값-출력-이미지
HashTable-결과값-출력

 

LinkedHashMap은 데이터를 넣은 순서대로 출력되는데, 즉, 'map.put' 한 순서대로 출력됩니다.

LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
        
        map.put(50, 1);
        map.put(10, 2);
        map.put(40, 3);
        map.put(2, 4);
        map.put(70, 5);
        map.put(9, 6);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
}

LinkedHashMap-예제-결과값-출력-이미지
LinkedHashMap-결과값-출력

 

정리


Map은 다른 배열들과 다르게 'Key' 'Value' 정의하여 'Key' 값을 통해 데이터를 출력합니다. 'Key' 중복은 불가능하고 Null 값 사용이 가능합니다. 

 

  • HashMap - 'Key' 중복 불가, 데이터 출력 시 정렬 없음
  • TreeMap - 'Key' 값 순서대로 자동 정렬
  • HashTable - Null 값 사용 불가, 데이터 출력 시 정렬 없음
  • LinkedHash Map - 'map.put' 순서에 따라 정렬 및 출력

 

 

댓글