
맵은 사실 컬렉션 클래스가 아니지만, 그냥 포함해서 말하고 있다. 4개의 컬렉션 (List, Queue, Deque, Set)과 더불어 많이 사용하기 때문에 잘 알아둬야 한다.
맵은 기본적으로 Key:Value구조로 이루어져있다. Key는 고유하며, 최대 하나의 값에 매핑될 수 있다.
put(key, value) : key,value를 map에 추가
get(key) : key에 대응하는 value를 반환
remove(key) : key와 대응하는 value를 삭제
containsKey(key) : key가 맵에 존재하는지 여부 확인
containsValue(value) : value가 맵에 존재하는지 여부 확인
keySet() : 모든 key를 set으로 반환
values() : 모든 값을 포함한 Collection을 반환
entrySet() : 모든 키-값 쌍을 포함한 set을 반환
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap
이렇게 많은 구현 클래스가 있지만, 자주 사용하는 7개를 정리한다.
해시 테이블 기반의 구현체로 빠른 검색, 삽입, 삭제를 제공한다.
Get, put의 시간복잡도가 O(1)이다.
Map<String,Integer> hmap = new HashMap<>();이런식으로 생성하면 된다.
멀티 스레드 환경에서 안전하게 사용하는 HashMap이다.
세그먼트 단위로 락을 거는 특징이 있다.
Map<String,Integer> hmap = new ConcurrentHashMap<>();
해시 테이블과 이중 연결 리스트를 기반으로 동작하는 Map이다.
입력된 순서 or 접근 순서를 유지하며 키-값 쌍을 저장하는 기능이 있다.
즉, 삽입 순서를 유지하는 HashMap이지만, 생성자에서 accessOrder를 true로 설정시 접근 순서로 변경할 수 있다.
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 여기서 loadFactor는 부하 계수.
NavigableMap인터페이스를 구현하여 키를 기준으로 오름차순으로 정렬된 Map이다. 내부적으론 Red-Black Tree를 기반으로 구현되어 있다.
키의 순서를 바꾸고 싶으면 Comparator를 구현하여 전달하면 된다.
검색, 삽입, 삭제 연산의 시간 복잡도는 O(log n)이다.
firstKey(): 가장 첫 번째(최소) 키를 반환
lastKey(): 가장 마지막(최대) 키를 반환
headMap(K toKey): 주어진 키보다 작은 키를 포함하는 서브맵을 반환
tailMap(K fromKey): 주어진 키보다 크거나 같은 키를 포함하는 서브맵을 반환
subMap(K fromKey, K toKey): 주어진 두 키 사이의 서브맵을 반환
ceilingKey(K key): 주어진 키보다 크거나 같은 가장 작은 키를 반환
floorKey(K key): 주어진 키보다 작거나 같은 가장 큰 키를 반환
higherKey(K key): 주어진 키보다 큰 가장 작은 키를 반환
lowerKey(K key): 주어진 키보다 작은 가장 큰 키를 반환
해시 테이블을 기반으로 한 Map이다. HashMap에서 동기화가 제거된 버전이라서 잘 사용하진 않는다.
가비지 컬렉터가 수거대상으로 설정 가능한 약한 참조를 이용한 HashMap이다. 메모리 누수를 방지하기 위해 이런 방법을 사용했으며, 메모리 효율성이 높다.
열거형을 키로 사용하는 맵이다. 이를 통해 효율적이고 안전한 방식으로 열거형 기반의 맵을 제공한다.