반응형
✅ 자바 Map 인터페이스 주요 구현체 비교
| 구분 | HashMap | LinkedHashMap | TreeMap | Hashtable (레거시) |
| 기본 구조 | 해시 테이블 | 해시 테이블 + 입력 순서 유지 | 이진 검색 트리 (Red-Black Tree) | 해시 테이블 |
| 정렬 여부 | ❌ 없음 (순서 불확정) | ✅ 입력한 순서 유지 | ✅ 키 기준 자동 정렬 (Comparable or Comparator) | ❌ 없음 (순서 불확정) |
| null 허용 여부 | ✅ null 키 1개, null 값 여러 개 허용 | ✅ 동일 | ❌ null 키 허용 안 함 | ❌ null 키/값 모두 허용 안 함 |
| 동기화 (Thread-safe) | ❌ 비동기화 | ❌ 비동기화 | ❌ 비동기화 | ✅ 내부적으로 동기화됨 (성능 낮음) |
| 성능 | 빠름 (O(1) 평균) | 약간 느림 (순서 관리 비용) | 느림 (O(log N)) | 가장 느림 |
| 레거시 여부 | ✅ 표준 사용 | ✅ 표준 사용 | ✅ 표준 사용 | 🔴 레거시 클래스 (과거 코드 유지용) |
| 사용 목적 | 일반적인 맵 (순서 필요 없음) | 순서 유지하며 맵 사용 시 | 정렬된 키 필요할 때 | 멀티스레드 환경에서 맵 사용 (비추천) |
✅ 사용 예제
🔹 HashMap (가장 자주 사용)
Map<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 2);
System.out.println(map.get("apple")); // 3
🔹 LinkedHashMap (입력 순서 유지)
Map<String, Integer> map = new LinkedHashMap<>();
map.put("a", 1);
map.put("b", 2);
// 출력 순서: a → b
🔹 TreeMap (자동 정렬)
Map<String, Integer> map = new TreeMap<>();
map.put("banana", 2);
map.put("apple", 3);
// 자동 정렬: apple → banana
🔹 Hashtable (과거 코드에서 사용)
Map<String, Integer> map = new Hashtable<>();
map.put("key", 1);
✅ 멀티스레드 환경에서 Map을 쓴다면?
🔐 Collections.synchronizedMap(...)
Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());
🔐 ConcurrentHashMap (최신, 추천)
- 고성능 멀티스레드용 Map
Map<String, Integer> map = new ConcurrentHashMap<>();
✅ 상황별 추천 Map
| 필요 조건 | 추천 Map |
| 일반적인 키-값 저장 (순서 필요 없음) | HashMap ✅ |
| 키-값 저장 + 입력 순서 유지 | LinkedHashMap ✅ |
| 키 정렬 필요 (예: 랭킹, 범위 탐색) | TreeMap ✅ |
| 멀티스레드 환경에서 높은 성능 원함 | ConcurrentHashMap ✅ |
| 과거 코드 호환성 유지 목적 | Hashtable (지양) |
반응형
'언어 > java' 카테고리의 다른 글
| [java] final,static, static final 차이 (0) | 2025.09.07 |
|---|---|
| [java] 열거형 타입 enum (0) | 2025.09.06 |
| [java] Set-HashSet, LinkedHashSet, TreeSet (0) | 2025.05.02 |
| [java] for, for each문 (0) | 2025.05.02 |
| [java] switch/case 문 (0) | 2025.05.02 |