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 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없다.
(같은 값을 다른 키로 저장하는 것은 가능)