Map 인터페이스
키와 값의 쌍(key-value pair)으로 데이터를 다룰 때 주로 사용하는 인터페이스입니다.
Collection 인터페이스의 하위 인터페이스가 아님
- 동일한 Key에 대해서는 하나의 값만 허용 (중복 Key 불가)
- Key의 순서는 자료구조에 따라 다를 수 있음 (있을 수도, 없을 수도 있음)
Map 인터페이스의 주요 메소드
| 메소드 | 설명 |
|---|
put(K key, V value) | 지정된 키에 값을 추가 이미 키가 존재하면 기존 값을 덮어씀 |
get(Object key) | 지정된 키에 매핑된 값을 반환 |
containsKey(Object key) | 지정된 키가 Map에 존재하는지 확인 |
remove(Object key) | 지정된 키를 삭제 |
keySet() | Map에 있는 모든 키를 Set 형태로 반환 |
values() | Map에 있는 모든 값을 Collection 형태로 반환 |
entrySet() | Map에 있는 모든 키-값 쌍을 Set 형태로 반환 |
HashMap 클래스
- 키-값(key-value)을 저장하는 자료구조
- 내부적으로 해싱(Hashing) 을 이용하여 데이터를 저장
- Key는 중복 불가능, Value는 중복 가능
- 동일한 Key에 대한 데이터가 추가되면 기존 값을 덮어씀
- 검색, 삽입, 삭제의 평균 시간 복잡도: O(1)
- 순서를 보장하지 않음
null 키 허용
TreeMap 클래스
Map 인터페이스의 구현체로, Key 기준 자동 정렬되는 Map
- 내부적으로 Red-Black Tree 자료구조 사용
- 정렬 기준: 숫자 → 알파벳 → 한글
- Key는 중복 불가, Value는 중복 가능
- 검색, 삽입, 삭제의 평균 시간 복잡도: O(log n)
- HashMap보다 성능이 느림
LinkedHashMap 클래스
Map 인터페이스의 구현체로, 삽입 순서 유지
- 내부적으로 HashTable + LinkedList 구조 사용
- 검색 속도는 O(1)
- Key 중복 불가, Value 중복 가능
- 삽입 순서를 유지 (HashMap과의 주요 차이점)
- 정렬 기능 없음
HashMap의 내부 동작 원리
- Key-Value 쌍을 저장
- 검색, 삽입, 삭제 연산: 평균 O(1)
- 일반적으로 Java에서 Map을 사용한다는 것은 HashMap 사용을 의미
- 내부 구조: 배열 + 연결 리스트 + 레드-블랙 트리
HashMap 요소 추가 매커니즘
hashCode()를 사용해 Key의 해시값 계산
- 해시값을 이용해 버킷(배열 인덱스) 결정
- 해당 버킷이 비어 있다면 바로 저장
- 버킷에 이미 요소가 있다면
equals()를 통해 중복 여부 확인
- 중복이 아니라면 요소 추가
- 요소가 적을 경우:
LinkedList 사용
- 충돌이 많아지면:
Red-Black Tree로 전환