🥞 BE
home

Map Interface

Map은 중복을 허용하지 않는 Key와 중복이 가능한 Value가 각각 쌍을 이루어 저장되는 자료구조이다.

Map Collection Class

Map 자료구조의 특징

중복 : 중복 불가 , index가 순차적 Key로 유일성을 가짐
순서 : 보장 불가
정렬 : 정렬 불가
동기화 (Thread-Safe) : 동기화 불가능, 불안전함
삽입 / 삭제 / 조회 연산이 광장히 빠르지만,
순서를 보장하지 않고, 정렬이 불가하다는 단점을 가지고 있다.
이러한 단점을 보완하기 위해서 자바에서는 HashMap , LinkedHashMap, TreeMap 세 가지의 클래스를 지원한다.

Map 자료구조의 종류

HashMap<K, V>
해시함수를 이용한 Map임
삽입 / 삭제 / 조회 연산의 O(1)을 보장하는 아주 빠른 자료구조
삽입 데이터의 순서를 보장하지 않음
정렬이 불가함
LinkedHashMap<K, V>
삽입 / 삭제가 맵보다 느림
삽입 순서를 보장함
정렬은 불가함
TreeMap<K, V>
삽입 / 삭제가 굉장히 느림,
삽입순서를 보장함
Map이지만 유일하게 정렬이 가능함.
Map을 써야하는데 정렬이 불가피하다면, TreeMap을 사용하면되고,
Map을 써야하는데 정렬은 필요없지만, 삽입순서를 기억해야한다면, LinkedHashMap을 쓰면된다.
그 외에는 당연이 가장 효율적이고 빠른 HashMap을 기본적으로 사용하자.
참고로 HashTable은 과거에 사용하던 클래스로 현재는 더 이상 지원하지 않는 클래스이다. 사용 지양.
HashMap예시
HashMap<String, Integer> hm = new HashMap<String, Integer>(); // put() 메소드를 이용한 요소의 저장 hm.put("삼십", 30); hm.put("십", 10); hm.put("사십", 40); hm.put("이십", 20); // Enhanced for 문과 get() 메소드를 이용한 요소의 출력 System.out.println("맵에 저장된 키들의 집합 : " + hm.keySet()); for (String key : hm.keySet()) { System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key))); } // remove() 메소드를 이용한 요소의 제거 hm.remove("사십") // iterator() 메소드와 get() 메소드를 이용한 요소의 출력 Iterator<String> keys = hm.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key))); } // replace() 메소드를 이용한 요소의 수정 hm.replace("이십", 200); for (String key : hm.keySet()) { System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key))); } // size() 메소드를 이용한 요소의 총 개수 System.out.println("맵의 크기 : " + hm.size());
Java
복사

주요 메소드

HashMap<K, V> 클래스 메소드

Map 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나이다.
HashMap은 Map을 구현한다. key와 value를 묶어 하나의 entry로 저장한다는 특징을 갖는다.
해시 알고리즘(hash algorithm)을 사용하여 많은 양의 데이터를 검색하는데 검색 속도가 매우 빠르다.
HashMap 클래스는 Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없다.
value에 null값도 사용 가능하다.
멀티쓰레드에서는 HashTable을 사용한다.
(같은 값을 다른 키로 저장하는 것은 가능)
메소드
설명
void clear()
해당 맵(map)의 모든 매핑(mapping)을 제거함.
boolean containsKey(Object key)
해당 맵이 전달된 키를 포함하고 있는지를 확인함.
boolean containsValue(Object value)
해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.
V get(Object key)
해당 맵에서 전달된 키에 대응하는 값을 반환함.만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.
boolean isEmpty()
해당 맵이 비어있는지를 확인함.
Set<K> keySet()
해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.
V put(K key, V value)
해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.
V remove(Object key)
해당 맵에서 전달된 키에 대응하는 매핑을 제거함.
V replace(K key, V value)
해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.
boolean replace(K key, V oldValue, V newValue)
해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.
int size()
해당 맵의 매핑의 총 개수를 반환함.
boolean remove(Object key, Object value)
해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.

TreeMap<K, V>

키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리(binary search tree)의 형태로 저장한다.
이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
TreeMap 클래스는 NavigableMap 인터페이스를 기존의 이진 검색 트리의 성능을 향상시킨 레드-블랙 트리(Red-Black tree)로 구현한다.
Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없다.
(같은 값을 다른 키로 저장하는 것은 가능)