Java 주요 컬렉션 비교표
List / Set / Map 핵심 컬렉션을 “성능·중복·정렬·쓰레드 안전” 관점에서 한 장으로 정리
List
Set
Map
Thread-safe
빠른 결론 (실무 기본값)
선택 스트레스 끝
✅
일반적인 리스트
ArrayList : 인덱스 접근이 빠르고 대부분의 CRUD에 무난합니다.
get O(1)
중간 삽입/삭제 O(n)
✅
중복 제거(Set)
HashSet : 순서 필요 없고 빠른 검색이 목적이면 기본 선택지입니다.
contains O(1)
정렬 X
✅
키-값(Map)
HashMap : 대부분의 일반적 Key-Value 저장소는 HashMap으로 해결됩니다.
get/put O(1)
키 중복 불가
멀티스레드라면 ConcurrentHashMap을 우선 고려하고, Hashtable은 레거시 호환 정도로만 사용합니다.
🧠 선택 가이드
상황별 추천
-
✅인덱스를 자주 참조해야 함 랜덤 접근 중심 UI/목록/캐시ArrayList
-
✅앞/중간에 자주 삽입·삭제 리스트 편집/큐 형태 처리LinkedList
-
✅중복 제거 + 빠른 검색 회원/태그/유니크 체크HashSet
-
✅삽입 순서 유지 + 중복 제거 입력 순서가 의미 있는 SetLinkedHashSet
-
✅정렬된 Set 필요 정렬된 목록/범위 탐색TreeSet
-
✅키-값 저장(Map) 일반적인 조회/캐시/매핑HashMap
-
✅멀티스레드 환경 동시성 보장 + 성능ConcurrentHashMap
-
⚠️레거시 코드 호환이 필요 요즘은 거의 안 씀Hashtable Legacy
✅ Java 주요 컬렉션 비교표
특징 · 성능 · 중복 · 정렬 · 쓰레드 안전
| 컬렉션 | 특징 | 주요 메서드 성능 | 중복 허용 | 정렬 보장 | 쓰레드 안전 |
|---|---|---|---|---|---|
| ArrayList | 배열 기반 리스트. 인덱스 접근이 빠름 | get: O(1) / add/remove: O(n) (중간) | 허용 | 삽입 순서 유지 | ❌ |
| LinkedList | 이중 연결 리스트. 삽입/삭제가 유리하지만 랜덤 접근이 느림 | get: O(n) / add/remove: O(1) (앞/뒤) | 허용 | 삽입 순서 유지 | ❌ |
| HashSet | 해시 기반 Set. 순서 없음. 검색 빠름 | add/remove/contains: O(1) | ❌ 중복 불가 | ❌ | ❌ |
| LinkedHashSet | HashSet + 삽입 순서 유지 | add/remove/contains: O(1) | ❌ | ✔ 삽입 순서 유지 | ❌ |
| TreeSet | Red-Black Tree 기반. 자동 정렬 | add/remove/contains: O(log n) | ❌ | ✔ 정렬됨 자연순/Comparator | ❌ |
| HashMap | 키-값 저장. 빠른 검색 | get/put/remove: O(1) | ❌ (키 중복 불가) | ❌ | ❌ |
| Hashtable Legacy | HashMap과 유사. 전체 동기화 기반 Thread-safe | get/put: O(1) | ❌ | ❌ | ✔ 느림 |
| ConcurrentHashMap | 동시성 보장. 락 분할/비블로킹 최적화(구현 전략은 JVM 버전별 상이) | get/put: 평균 O(1) | ❌ | ❌ | ✔ 고성능 |
⚡ 성능 감각 빠르게 잡기
헷갈리는 포인트만 딱 정리
- ArrayList는 끝에 add는 빠르지만, 중간 insert는 전체 shift 때문에 느릴 수 있습니다.
- LinkedList는 임의 접근(get)이 느립니다. “앞/뒤 삽입·삭제”가 핵심일 때만 유리합니다.
- TreeSet은 정렬을 유지하니 O(log n)으로 느릴 수 있지만, 정렬된 결과가 바로 필요하면 전체 sort 비용을 줄일 수 있습니다.
🧵 쓰레드 안전 선택법
멀티스레드에서는 “락 전략”이 성능을 좌우합니다
- ConcurrentHashMap : 실무 기본값 (동시성 + 성능)
- Collections.synchronizedMap(...) : 간단하지만 전체 락 방식이라 경쟁이 심하면 느릴 수 있음
- Hashtable : 레거시 호환 외에는 거의 사용하지 않음
Tip: “정렬 + 동시성”이 동시에 필요하면 요구사항부터 재검토하거나 별도 구조(스냅샷/복제/락 설계)를 고려하세요.
'IT > Programming' 카테고리의 다른 글
| Java 큐/스택 계열 컬렉션 비교 (0) | 2026.01.21 |
|---|