목차
- Map
- HashMap
- HashTable
- TreeMap
- LinkedHashMap
Map(java.util.Map)
- Map은 key-value 형태로 데이터를 저장하는 자료구조입니다.
- Java에서 Map 인터페이스를 제공합니다.
- Key값은 중복을 허용하지 않습니다.
- Map에서 특정 데이터를 찾을때 Key값을 이용해서 검색합니다.
- HashMap, TreeMap, HashTable, LinkedHashMap 클래스로 Map 인터페이스를 구현할 수 있다.
Map 주요 메서드
- put(key,value): 데이터를 넣는다.
- get(key): 해당 key값의 value를 조회한다.
- remove(key): 데이터를 삭제한다.
HashMap
- key값의 중복을 허용하지 않고 순서를 보장하지 않습니다.
- 탐색 시간복잡도: O(1)
- HashMap은 key와 value에 null 저장을 허용합니다.
- HashMap은 동기화(Synchronization)를 지원하지 않습니다 (비동기).
- Single Thread 환경에서 사용
- HashMap은 동기화가 지원되지 않기 때문에 thread-safe하지 않습니다.
- HashMap을 Thread safe하게 이용하려면 다음과 같이 선언하면됩니다.
- Map m = Collections.synchronizedMap(new HashMap(…))
- Java 5부터 제공하는 ConcurrentHashMap을 사용하는 것이 더 좋은 방법이다.
- thread-safe하지 않는 이유에 대해서는 추후 다루겠습니다.
순서를 보장하지 않는 이유?
- 탐색 시간복잡도: O(1)
- Single Thread 환경에서 사용
- HashMap을 Thread safe하게 이용하려면 다음과 같이 선언하면됩니다.
- Map m = Collections.synchronizedMap(new HashMap(…))
- Java 5부터 제공하는 ConcurrentHashMap을 사용하는 것이 더 좋은 방법이다.
- thread-safe하지 않는 이유에 대해서는 추후 다루겠습니다.
순서를 보장하지 않는다는 말은 즉, 정렬되지 않는다는 것을 의미합니다. 그 이유는 HashMap의 경우 기본적으로 key값이 객체의 hashCode() 메소드의 리턴 값을 기반으로 관리하기 때문에 HashMap으로 관리되는 데이터 전체를 출력했을 때는 순서가 뒤섞여서 출력됨을 볼 수 있습니다.
따라서, 해시 함수를 사용하기 때문에 HashMap의 탐색 시간복잡도는 O(1) 입니다.
HashTable
- HashTable은 동기화(Synchronization) 지원합니다(동기).
- Multi Thread 환경에서 사용
- Hashtable은 동기화 처리라는 비용때문에 HashMap에 비해 속도가 느립니다.
- key와 value에 null이 허용되지 않습니다.
- HashTable은 객체를 저장하거나 불러올때 key가 hashCode 메소드와 equals 메소드를 사용하기 때문에 null을 불허합니다.
TreeMap
- RedBlack Tree(이진검색트리)의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장합니다.
- 정렬된 순서로 키, 값 쌍을 저장하므로 빠른 검색이 가능합니다.
- 저장시 key값을 정렬(사전순, 오름차순)을 하기 때문에 저장시간이 다소 오래걸립니다.
- 정렬 기준: 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글
- key값에 대한 Compartor 구현으로 정렬 순서를 바꿀수 있습니다.
LinkedHashMap
- LinkedHashMap에 저장되는 각 항목은 Map.Entry 클래스를 구현한 Node 클래스로 내부에 before, after 멤버를 갖는 연결 리스트 구조를 가지고 있습니다.
- LinkedHashMap으로 구현된 Map은 데이터의 ‘입력된 순서’ 를 기억합니다.
- 기본적으로 HashMap을 상속받아 HashMap과 매우 흡사합니다.
- 데이터 추가/제거: O(1)
- 데이터 조회: O(1)
- Map에 있는 엔트리들의 연결 리스트가 유지되므로 입력한 순서대로 반복 가능합니다.