Map은 키와 값 쌍으로 데이터를 저장하는 자료구조이다.
키는 유일해야 한다.
값은 중복될 수 있다.
순서를 보장하지 않는다.
단, 'LinkedHashMap'은 예외적으로 항목을 추가한 순서대로 순회할 수 있다.
HashMap은 null 키와 null 값 허용
TreeMap은 null 키와 null 값 허용 X
get(Object key): Object key는 검색하고자 하는 키이며, 메서드는 키와 연결된 값을 반환한다. 만약 키가 존재하지 않는다면 'null'을 반환한다.
put(K key, V value):
K key는 Map에 추가할 항목의 크기이다.
V value는 해당 키와 연결된 값이다.
메서드는 키에 이전에 연결되어 있던 값(V)을 반환한다. 만약 키가 존재하지 않는다면 'null'을 반환한다.
참고로,put()메서드는 키가 이미 Map에 존재하는 경우, 기존의 값을 새로운 값으로 대체한다. 새로운 키-값 쌍을 추가할 때는 해당 키에 대한 이전 값이 없으므로 'null'을 반환한다.
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10); // "apple" 키에 10 값을 추가합니다.
map.put("banana", 20); // "banana" 키에 20 값을 추가합니다.
Integer appleValue = map.get("apple"); // appleValue는 10입니다.
Integer orangeValue = map.get("orange"); // orangeValue는 null입니다. "orange" 키는 Map에 존재하지 않습니다.
remove(Object key): 지정된 키와 그에 매핑된 값을 제거
containsKey(Object key): 지정된 키가 Map에 존재하는지 여부를 반환
containsValue(Object value): 지정된 값이 Map에 하나 이상 존재하는지 여부를 반환
size(): Map에 저장된 키-값 쌍의 수를 반환
isEmpty(): Map이 비어 있는지 여부를 반환
clear(): Map에서 모든 매핑을 제거
keySet(): Map에 있는 모든 키를 Set 형태로 반환
values(): Map에 있는 모든 값을 컬렉션 형태로 반환
entrySet(): Map에 있는 모든 매핑을 Map.Entry 객체의 Set 형태로 반환
이 메서드를 이용하면 Map의 모든 요소를 순회하며 각 키와 이에 해당하는 값을 접근한다.
Set<Map.Entry<K,V>> entrySet();
import java.util.HashMap;
import java.util.Map;
public class EntrySetExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("cherry", 30);
// entrySet() 메서드를 사용하여 Map의 모든 키-값 쌍을 순회
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + ": " + value);
}
}
}
//entrySet()은 Map의 키-값 쌍을 Map.Entry 객체의 Set으로 반환한다.
//반환된 Set을 순회하면서 각 Entry 객체를 통해 키와 값에 접근할 수 있다.
//getKey() 메서드와 getValue() 메서드를 사용하여 각 Entry의 키와 값을 가져올 수 있다.
//entrySet() 메서드는 Map의 뷰(view)를 제공한다. 즉, entrySet()으로 반환된 Set 내의 요소를 변경하면 원본 Map도 함께 변경
HashMap: 가장 일반적으로 사용되는 Map 구현체로, 해시 테이블을 사용하여 키-값 쌍을 저장한다. 순서를 보장하지 않는다.
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
// HashMap 생성
Map<String, Integer> map = new HashMap<>();
// 요소 추가
map.put("apple", 10);
map.put("banana", 20);
map.put("cherry", 30);
// 특정 키에 대한 값 조회
System.out.println("apple의 가격: " + map.get("apple"));
// 모든 키 출력
System.out.println("모든 과일: ");
for (String key : map.keySet()) {
System.out.println(key);
}
// 모든 값 출력
System.out.println("모든 가격: ");
for (Integer value : map.values()) {
System.out.println(value);
}
// 키-값 쌍 출력
System.out.println("과일과 가격: ");
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
TreeMap: 레드-블랙 트리 기반의 NavigableMap 구현체로, 키에 따라 정렬된 순서를 보장한다.
import java.util.Map;
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
// TreeMap 생성
Map<String, Integer> treeMap = new TreeMap<>();
// 요소 추가
treeMap.put("apple", 10);
treeMap.put("banana", 20);
treeMap.put("cherry", 30);
// 키에 따라 자동 정렬됨을 확인
System.out.println("정렬된 과일과 가격: ");
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
LinkedHashMap: HashMap의 순서 보장 버전으로, 항목을 추가한 순서 또는 마지막에 접근한 순서로 순회할 수 있다.
Hashtable: HashMap과 유사하지만, 동기화된(synchronized) 메서드를 제공하여 멀티 스레드 환경에서 사용할 수 있다. 현대 자바에서는
ConcurrentHashMap을 선호한다.
ConcurrentHashMap: 멀티 스레드 환경에서 높은 동시성을 제공하는 Map이다.
멀티스레드 환경에서 여러 스레드가 동시에 Map에 접근하고 수정할 때 발생할 수 있는 동시성 문제를 해결하기 위해 설계되었다.
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// 요소 추가
map.put("apple", 10);
map.put("banana", 20);
// 요소 조회
System.out.println(map.get("apple")); // 10 출력
// 요소 삭제
map.remove("apple");
// 요소 순회
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}