Map
📌 Map
Key와 Value를 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스
- 값은 중복해서 저장할 수 있지만, 키는 중복되어서는 안 된다.
- 만약 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 최근에 저장된 값이 남게 된다.
- 저장 순서가 유지되지 않는다.
✅ Methods
Method | Description |
void clear() | Map의 모든 객체를 삭제 |
boolean containsKey(Object key) | 지정된 key 객체와 일치하는 Map의 key 객체가 있는지 확인 |
boolean containsValue(Object value) | 지정된 value 객체와 일치하는 Map의 value 객체가 있는지 확인 |
Set entrySet() | Map에 저장되어 있는 key-value 쌍을 Map.Entry 타입의 객체로 저장한 Set으로 반환 |
boolean equals(Object o) | 동일한 Map인지 비교 |
Object get(Object key) | 지정된 key 객체에 대응하는 value 객체를 찾아서 반환 |
int hashCode() | 해시코드 반환 |
boolean isEmpty() | Map이 비어있는지 확인 |
Set keySet() | Map에 저장된 모든 key 객체를 반환 |
Object put(Object key, Object value) | Map에 value 객체를 key 객체에 연결(mapping)하여 저장 |
void putAll(Map t) | 지정된 Map의 모든 key-value 쌍을 추가 |
Object remove(Object key) | 지정한 key 객체와 일치하는 key-value 객체를 삭제 |
int size() | Map에 저장된 key-value 쌍의 개수를 반환 |
Collection values() | Map에 저장된 모든 value 객체를 반환 |
Key는 중복을 허용하지 않기 때문에 Set 타입으로 반환하고, Value는 중복을 허용하므로 Collection 타입으로 반환하는 것을 볼 수 있다.
✅ Map.Entry 인터페이스
Map 인터페이스의 내부 인터페이스다. Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry 인터페이스를
정의해 둔 것이다. 이것은 보다 객체지향적으로 설계하도록 유도하기 위한 것으로 Map 인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스도 함께 구현해야 한다.
Method | Description |
boolean equals(Object o) | 동일한 Entry인지 비교 |
K getKey() | Entry의 Key 객체를 반환 |
V getValue() | Entry의 Value 객체를 반환 |
int hashCode() | Entry의 해시코드 반환 |
V setValue(V value) | Entry의 value 객체를 지정된 객체로 변경 |
❓ Map의 Iterator 얻는 방법
Map 인터페이스를 구현한 컬렉션 클래스는 key-value 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set 형태로 얻어 온 후에 다시 iterator()를
호출해야 Iterator를 얻을 수 있다.
Map map = new HashMap();
...
Iterator it = map.entrySet().iterator();
❓ Map.get(key) vs Map.getOrDefault(key, default)
Map.get은 키에 대한 값을 리턴하며, Null 값인 경우 NPE가 발생한다. 반면, Map.getOrDefault는 키가 존재하지
않을 경우 default 값을 리턴하므로 NPE가 발생하지 않는다.
public class UpdateValueOfHashMap {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("melon", 2);
map.put("kiwi", 3);
map.put("melon", map.getOrDefault("melon", 0) + 10);
map.put("banana", map.getOrDefault("banana", 0) + 10);
System.out.println("Result: " + map);
}
}
📖 종류
✅ HashMap
해싱 기능을 장착한 Map
- 배열과 연결이 결합된 Hashing 형태로, 키와 값을 묶어 하나의 데이터(Entry)로 저장
- 중복 x, 순서 x
- 키와 값으로 Null 허용
- 추가/삭제/검색/접근성이 모두 뛰어나다.
- Thread-unsafe (멀티 스레드 환경 ➡ ConcurrentHashMap 권장)
✅ LinkedHashMap
Entry들이 연결 리스트를 구성하여 순서를 보장하는 Map
✅ TreeMap
정렬이 가능한 Map
- 이진 검색 트리(binary search tree) 형태로 key-value 쌍을 저장
- 키는 저장과 동시에 자동(기본) 오름차순 정렬
- Key 값 기준 정렬
- 정렬되는 순서: 숫자 ➡ 알파벳 대문자 ➡ 알파벳 소문자 ➡ 한글
- 검색에 관한 한 대부분의 경우에서 HashMap이 TreeMap보다 더 뛰어남
- 키와 값을 저장하는 동시에 정렬을 행하기 때문에 저장 시간이 다소 오래 걸림
- 다만, 범위 검색이나 정렬이 필요한 경우에는 TreeMap이 효율성 면에서 좋음
🔍 Red-Black Tree
TreeMap은 기존의 이진 탐색 트리의 문제점을 보완한 Red-Black Tree로 이루어져 있다.
일반적인 이진 탐색 트리는 트리 높이만큼 접근 시간이 필요하다. 값이 전체 트리에 잘 분산되어 있다면 효율성에 있어 크게
문제가 없으나 데이터가 편향되어 들어올 경우 한쪽으로 크게 치우쳐진 트리가 되어 굉장히 비효율적인 성능(O(N))을 보인다.
이러한 문제를 보완하기 위해 Red-Black Tree를 사용한다.
Red-Black Tree는 데이터의 추가나 삭제 시 트리가 한쪽으로 치우쳐지지 않도록 균형을 맞춘다. 그래서 최악의 경우에도 O(logN) 시간 안에 검색, 삽입, 삭제 연산이 가능하도록 해준다.
✅ HashTable
Key를 특정 해시 함수를 통해 해싱한 후 나온 결과를 배열의 인덱스로 사용하여 Value를 찾는 자료구조
- 자바 초기 버전에 나온 레거시 클래스
- HashMap보다는 느리지만 Thread-safe 기본 지원
- 키와 값으로 Null 허용 x
✅ Properties
HashTable을 상속받아 구현한 것으로 <String, String> 형태로 저장하는 보다 단순화된 key-value 컬렉션
주로 애플리케이션의 환경설정과 관련된 속성을 저장하는 데 사용되며, 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공
특징으로 저장 순서를 유지하지 않는다.
References:
🧱 Java Collections Framework 종류 💯 총정리
Java Collection Framework 자바 새내기분들은 컬렉션 프레임워크라는 단어에 뭔가 거창하고 어려운 느낌이 들수 있겠지만, 그냥 자료 구조(Data Structure) 종류의 형태들을 자바 클래스로 구현한 모음집
inpa.tistory.com
https://codechacha.com/ko/java-how-to-update-value-of-key-from-hashmap/#5-getordefault
Java - HashMap에서 key로 value 업데이트
HashMap에서 key로 value를 업데이트하는 방법을 소개합니다. put(key, value)으로 이전에 등록된 key에 대한 value를 업데이트할 수 있습니다. containsKey(key)와 삼항연산자를 이용하여 key가 존재하는 경우만
codechacha.com
https://coding-factory.tistory.com/557
[Java] 자바 TreeMap 사용법 & 예제 총정리
TreeMap이란? TreeMap은 이진트리를 기반으로 한 Map 컬렉션입니다. 같은 Tree구조로 이루어진 TreeSet과의 차이점은 TreeSet은 그냥 값만 저장한다면 TreeMap은 키와 값이 저장된 Map, Etnry를 저장한다는 점입
coding-factory.tistory.com