https://hobbyatelier.tistory.com/94
Java) Map 자료구조 간단 설명
Map은 키-값(key-value) 쌍으로 데이터를 저장하는 자료구조입니다. 간단히 말하면, 특정 키를 이용해 원하는 값을 빠르게 찾을 수 있게 해주는 구조이다.1. 기본 개념인터페이스 이름: java.util.Map대
hobbyatelier.tistory.com
이전 게시글에서는 Map 자료구조에 대해서 썼었다.
이번에는 Map 인터페이스를 구현한 대표적인 3가지 구현체에 대해 써보겠다.
1. 자바에서 제공하는 주요 Map 구현체들
- HashMap
- 가장 일반적으로 쓰이는 Map.
- 키 순서를 보장하지 않음.
- null 키와 null 값을 허용.
- LinkedHashMap
- HashMap의 확장.
- 입력 순서를 유지함.
- 순회 순서가 예측 가능.
- TreeMap
- 정렬된 Map.
- 키의 자연 순서나 Comparator를 기준으로 정렬.
- 성능은 HashMap보다 느리지만 정렬이 필요할 때 유용.
2. 자주 쓰는 Map 3종 비교
항목 | HashMap | LinkedHashMap | TreeMap |
정렬/순서 | 없음 | 입력 순서 유지 | 자동 정렬 (오름차순) |
시간 복잡도 | O(1) (평균) | O(1) (평균) | O(log n) |
기반 구조 | 해시 테이블 | 해시 테이블 + 연결 리스트 | 레드-블랙 트리 |
null 키/값 허용 | 허용 | 허용 | 키는 불가, 값은 허용 |
사용 예시 | 빠른 조회 | 순서를 중요시할 때 | 정렬된 맵 필요할 때 |
3.언제 어떤 걸 써야 할까?
- HashMap
→ 기본 Map으로 거의 모든 경우에 사용 가능. 성능도 좋고 가장 많이 쓰임.
→ 단, 순서에 대한 보장이 전혀 없다는 걸 기억. - LinkedHashMap
→ 반복 순서가 중요할 때 (예: 캐시 구현, 최근 입력 순서대로 출력 등).
→ 입력 순서를 그대로 유지하므로 디버깅할 때도 보기 편함. - TreeMap
→ 키를 정렬된 상태로 유지해야 할 때.
→ ex) 사전식 정렬, 범위 검색 (subMap, tailMap 등) 기능이 유용함.
4. Map의 대표적인 3가지 구현체 사용법
HashMap, LinkedHashMap, TreeMap은 모두 Map 인터페이스를 구현하고 있어서 기본적인 함수들은 거의 동일함.
하지만 TreeMap은 정렬과 탐색 관련된 기능이 추가로 좀 더 있고, LinkedHashMap은 순서 유지와 관련된 특징이 있다.
5. 공통적으로 제공되는 주요 Map 인터페이스 메서드
(HashMap, LinkedHashMap, TreeMap 모두 사용 가능)
메서드 설명
put(K key, V value) | 키-값 쌍 추가 (또는 덮어쓰기) |
get(Object key) | 키로 값 조회 |
remove(Object key) | 키로 항목 제거 |
containsKey(Object key) | 해당 키가 존재하는지 확인 |
containsValue(Object value) | 해당 값이 존재하는지 확인 |
size() | 맵에 있는 항목 수 |
isEmpty() | 맵이 비어 있는지 확인 |
clear() | 모든 항목 제거 |
keySet() | 키들의 Set 반환 |
values() | 값들의 Collection 반환 |
entrySet() | Map.Entry 객체들의 Set 반환 |
6. LinkedHashMap 특유의 메서드
메서드 설명
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) | TreeMap 가 true일 경우, 최근 접근 순서로 정렬 |
→ 사용 예시: LRU 캐시 구현 가능 |
7. TreeMap 특유의 메서드
(NavigableMap, SortedMap 인터페이스도 구현함)
메서드 설명
firstKey() / lastKey() | 가장 작은 / 큰 키 반환 |
higherKey(K key) | 주어진 키보다 큰 가장 작은 키 |
lowerKey(K key) | 주어진 키보다 작은 가장 큰 키 |
ceilingKey(K key) | 주어진 키 이상인 가장 작은 키 |
floorKey(K key) | 주어진 키 이하인 가장 큰 키 |
subMap(K fromKey, K toKey) | 키 범위로 부분 맵 반환 |
descendingMap() | 내림차순 정렬된 맵 반환 |
8. 구현 예시 :
1) HashMap
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
System.out.println(map.get("apple")); // 1
System.out.println(map.containsKey("banana")); // true
2) TreeMap
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("c", 3);
treeMap.put("a", 1);
treeMap.put("b", 2);
System.out.println(treeMap.firstKey()); // a가 순서상 가장 앞임 a,b,c ...
System.out.println(treeMap.subMap("a", "c")); // {a=1, b=2}
3) LinkedHashMap
- 입력 순서 유지
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapExample {
public static void main(String[] args) {
Map<String, Integer> linkedMap = new LinkedHashMap<>();
linkedMap.put("apple", 10);
linkedMap.put("banana", 20);
linkedMap.put("cherry", 30);
for (Map.Entry<String, Integer> entry : linkedMap.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}
// 출력 결과
apple = 10
banana = 20
cherry = 30
- 접근 순서 유지
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUExample {
public static void main(String[] args) {
// accessOrder = true → 최근 사용된 순서대로 정렬
Map<String, String> lruMap = new LinkedHashMap<>(16, 0.75f, true);
lruMap.put("A", "Apple");
lruMap.put("B", "Banana");
lruMap.put("C", "Cherry");
// "A"에 접근
lruMap.get("A");
for (Map.Entry<String, String> entry : lruMap.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}
// 출력 결과
B = Banana
C = Cherry
A = Apple // A에 접근했기 때문에 가장 마지막에 출력됨.
'공부 > 자바(Java)' 카테고리의 다른 글
Java) Queue란? (큐 간단 설명, 사용법, 예제) (3) | 2025.04.05 |
---|---|
Java) Stack이란? (간단 설명, 사용법, 예시) (0) | 2025.04.05 |
Java) List란? (ArrayList, LinkedList, Vector 설명, 사용법, 예시) (0) | 2025.04.05 |
Java) Map 자료구조 간단 설명 (0) | 2025.04.04 |
JAVA) 경로 안의 파일들 목록 텍스트 파일로 저장하기 (2) | 2025.03.24 |