[Java] Map
Map, java.util.Map, Java Map, Map interface, 맵
정의
java.util.Map<K,V> 는 key 와 value 의 쌍으로 데이터를 저장 하는 자료구조의 인터페이스. 하나의 key 에는 하나의 value 만 매핑, 중복 key 는 허용하지 않는다.
Map 은 Collection 을 extends 하지 않는다 (key-value 쌍 의미가 단일 원소와 다르므로). 그래도 keySet(), values(), entrySet() 을 통해 Collection 인터페이스의 view 를 제공.
핵심 메서드
| 메서드 | 의미 |
|---|---|
put(K, V) | 매핑 추가 또는 갱신, 이전 값 반환 |
get(Object) | key 로 value 조회, 없으면 null |
getOrDefault(Object, V) | 없으면 기본값 |
containsKey(Object) | key 존재 여부 |
containsValue(Object) | value 존재 여부 (보통 O(n)) |
remove(Object) | key 제거 |
size(), isEmpty() | 크기 |
keySet(), values(), entrySet() | view 들 |
Java 8+ 의 기본 메서드
map.putIfAbsent(key, value);
map.computeIfAbsent(key, k -> expensive(k));
map.computeIfPresent(key, (k, v) -> v + 1);
map.compute(key, (k, v) -> v == null ? 1 : v + 1);
map.merge(key, 1, Integer::sum);
map.replace(key, oldVal, newVal);
구현체 한눈에
| 구현 | 순서 | thread-safe | null 허용 | 백킹 |
|---|---|---|---|---|
| HashMap | 없음 | ✗ | key 1, value 다수 | 해시 테이블 |
| LinkedHashMap | 삽입 순서 또는 접근 순서 | ✗ | key 1, value 다수 | 해시 + linked list |
| TreeMap | 정렬 (Comparable / Comparator) | ✗ | value 다수, key 는 null 비허용 | Red-Black Tree |
Hashtable (legacy) | 없음 | ✓ (메서드) | 둘 다 비허용 | 해시 |
| ConcurrentHashMap | 없음 | ✓ (bin-level) | 둘 다 비허용 | 해시 + CAS + sync |
| **[[Spring] ConcurrentReferenceHashMap]] | 없음 | ✓ | 비허용 | 해시 + Weak/Soft ref |
EnumMap | enum 정의 순서 | ✗ | value 다수 | 배열 |
IdentityHashMap | 없음 | ✗ | 다수 | == 비교 |
WeakHashMap | 없음 | ✗ | 다수 | key 약참조 |
불변 Map (Java 9+)
Map<String, Integer> ages = Map.of("Alice", 30, "Bob", 25);
Map<String, Integer> more = Map.ofEntries(
Map.entry("a", 1),
Map.entry("b", 2)
);
10개 이상이거나 일관성 있게 표현하려면 ofEntries.
entrySet 순회가 가장 효율적
// ❌ 비효율 (key 로 다시 get)
for (String k : map.keySet()) {
System.out.println(k + "=" + map.get(k));
}
// ✓ entrySet 직접 순회 (해시 lookup 1번)
for (Map.Entry<String, Integer> e : map.entrySet()) {
System.out.println(e.getKey() + "=" + e.getValue());
}
// ✓ Java 8+ forEach
map.forEach((k, v) -> System.out.println(k + "=" + v));
동기화 옵션
Map<K, V> sync = Collections.synchronizedMap(new HashMap<>());
Map<K, V> concurrent = new ConcurrentHashMap<>(); // 권장
ConcurrentHashMap 이 거의 항상 더 빠르다.
참고
- Object
- Iterable
- Collection
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- [[Spring] ConcurrentReferenceHashMap]]
- fail-fast iterator
이 글의 용어 (8개)
- [Java] Collectionjava
- 정의 는 그룹으로 묶인 객체들을 표현하는 최상위 인터페이스. JCF (Java Collections Framework) 의 입구이자, / / / 모두 이를 확장한다. 자체는 직접…
- [Java] ConcurrentHashMapjava
- 정의 는 고동시성 환경에서 사용 가능한 구현. JSR-166 (Java 5) 도입, Java 8 에서 내부 구조가 크게 재작성됐다. 과 같은 인터페이스를 제공하면서 thread-…
- [Java] Fail-Fast Iteratorjava
- 정의 Fail-Fast Iterator 는 순회 도중 컬렉션의 구조가 변경되면 즉시 을 던지는 iterator. , , 등 대부분의 컬렉션의 iterator 가 이 방식. 목적은…
- [Java] HashMapjava
- 정의 는 해시 테이블 로 구현된 . 평균 O(1) 의 put/get/remove 를 보장하고 단일 스레드 환경의 사실상 표준. JDK 1.2 도입, Java 8 에서 충돌 시 l…
- [Java] Iterablejava
- 정의 는 루프로 순회 가능한 모든 타입의 최상위 인터페이스. 단 하나의 추상 메서드, 를 정의한다. 인터페이스가 을 extends 하므로 , , , 등 모든 컬렉션이 자동으로 대…
- [Java] LinkedHashMapjava
- 정의 는 을 상속해 삽입 순서 (또는 접근 순서) 를 유지 하는 Map. 모든 의 평균 O(1) 성능을 유지하면서 추가로 순회 순서가 일관된다. 핵심: 이중 연결 리스트 (dou…
- [Java] Objectjava
- 정의 는 Java 의 모든 클래스의 최상위 부모 (root) 클래스. 가 명시되지 않은 클래스는 컴파일러가 자동으로 를 붙인다. 인터페이스는 클래스가 아니라 를 직접 상속하지는 …
- [Java] TreeMapjava
- 정의 는 Red-Black Tree 기반의 정렬된 . (확장 인터페이스) 을 구현해 범위 쿼리, floor/ceiling, sub-map 같은 정렬 기반 연산을 제공한다. key…
💬 댓글