목차
- 개념 및 특징
- 구현체
- 메소드
- 중첩 클래스(Nested Class) - Map.Entry
1. 개념 및 특징
- 개념
중복을 허용하지 않는 Key와 중복을 허용하지 않는 Value가 각각 쌍을 이루어 저장되는 자료구조
- 특징
- 중복 X
- 삽입 순서 보장 X
- 정렬 불가능
- 동기화 (Thread-safe) 지원 X
2. 구현체
- HashMap
- 해시함수를 이용한 Map
- 삽입 / 삭제 / 조회 연산의 O(1)을 보장하는 아주 빠른 자료구조
- 삽입 순서 보장 X
- 정렬 불가능
- 동기화 지원 X
- LinkedHashMap
- 삽입 / 삭제가 HashMap에 비해 느림
- 삽입 순서를 보장
- 정렬 불가능
- 동기화 지원 X
- TreeMap
- 삽입 / 삭제가 굉장히 느림
- 삽입 순서를 보장
- Map이지만 정렬이 가능
- 동기화 지원 X
- HashTable(과거에 사용, 현재는 사용을 지양)
- HashMap의 특징을 가지고 있는 자료구조
- 쓰레드간 락을 검
- key와 value로 null을 허용하지 않음
- 단, 동기화를 지원함
- ConcurrentHashMap
- HashMap의 특징을 가지고 있는 자료구조
- 어떤 Entry를 조작할 때 해당 Entry에만 락을 걸어 HashTable보다 속도가 빠름.
- key와 value로 null을 허용하지 않음
- 단, 동기화를 지원함
이 밖에도 다양한 구현체가 있지만, 이 정도만 소개하겠습니다.
3. 메소드
1. int size()
- map에 들어있는 데이터의 개수를 반환합니다.
- 만약, Integer.MAX_VALUE보다 데이터가 많다면 Integer.MAX_VALUE를 반환합니다.
2. boolean isEmpty()
- map에 데이터가 없다면 true를 리턴합니다.
3. boolean containsKey(Object key)
- map에 특정 key가 존재하는지 확인하고 있다면 true를 리턴합니다.
- 만약 존재한다면 true를 리턴합니다.
4. boolean ContainsValue(Object value)
- map에 특정 값이 있을 경우 true를 리턴합니다.
- 대부분의 맵 구현체에서 O(N)의 시간 복잡도를 가집니다.
5. V get(Object key)
- key 값을 통해 value를 리턴합니다.
- 만약에 구현체가 value로 null을 허용한다면 return된 value인 null은 매핑된 key가 없다는 뜻 혹은 null에 매핑되었다는 뜻입니다.
- 이는 containsKey 메소드로 두 케이스를 구분할 수 있습니다.
6. V put(K key, V value)
- key-value 쌍을 map에 넣습니다.
- 만약에 key값이 map 들어있던 것이라면 덮어씁니다.
7. V remove(Object key)
- key값을 통해 데이터를 제거합니다.
- return되는 값은 이전에 매핑되어 있던 value값입니다.
- 만약에 null을 value로 허용하는 구현체라면 매핑된 key가 없다는 뜻 혹은 null에 매핑되었다는 뜻입니다.
8. void putAll(Map<? extends K, ? extends V> m)
- 특정한 map에서 모든 key-value 쌍을 이 map으로 복사합니다.
9. void clear()
- map에 있는 모든 값을 제거합니다.
10. Set<K> keySet()
- key로 구성된 Set을 반환합니다.
11. Collection<V> values()
- map에 있는 value들을 Collection으로 반환합니다.
12. Set<Map.Entry<K, V>> entrySet()
- 하단에 Map.Entry를 다루며 자세히 설명하겠습니다.
13. V getOrDefault(Object key, V defaultValue)
- 만약 key가 있다면 그 값을 가져옵니다.
- 없을경우 기본값으로 가져옵니다.
14. V putIfAbsent(K key, V value)
- 만약 특정 key가 map에 없다면 key-value쌍을 map에 put합니다.
15. V replace(K key, V value)
- 지정된 key가 map에 없다면 동작 X, null을 반환
- 만약 key가 있다면 해당 key의 현재 값을 value로 교체하고 현재 값을 반환
- 즉, key가 있어야만 작동한다.
이 밖에도 replaceAll, computeIfAbsent, computeIfPresent, compute 등은
자바 8을 더 공부하고 나서 추가로 올릴 예정입니다.
4. 중첩 클래스(Map.Entry)
Map은 Map.Entry 인터페이스를 중첩 클래스로 가지고 있습니다.
Map.Entry?
iterator를 통해 접근 해야하지만 Map에 저장된 모든 key-value 쌍을
각각의 key-value를 갖고 있는 하나의 객체로 얻을 수 있게 해주는 인터페이스입니다.
어떤 효용이 있을까요?
간단한 예시로 알아보겠습니다.
Map<String, String> hashMap = new HashMap<>();
for (String key: hashMap.keySet()){
System.out.println("key : " + key);
System.out.println("value : " + hashMap.get(key));
}
기존에는 모든 key-value 쌍의 값을 확인하려면 위와 같이 코드를 짰습니다.
Map.entrySet으로 리팩터링 해보겠습니다.
Map<String, String> hashMap = new HashMap<>();
for (Map.Entry<String, String> entry: hashMap.entrySet()){
System.out.println("key : " + entry.getKey());
System.out.println("value : " + entry.getValue());
entry.setValue("str");
System.out.println("change value : " + entry.getValue());
}
Map.Entry를 사용하면
메서드
- getKey()
- getValue()
- setValue(V value()
으로 값을 쉽게 가져오고 변화시킬 수 있습니다.
reference
https://tecoble.techcourse.co.kr/post/2021-11-26-hashmap-hashtable-concurrenthashmap/
https://docs.oracle.com/javase/8/docs/api/
'Language > Java' 카테고리의 다른 글
[Java][Collections Framework 완전 정복] Stack 클래스를 사용하지 않는 이유 및 대안 (0) | 2025.01.16 |
---|---|
[Java][Collections Framework 완전 정복] Set 인터페이스(HashSet) (0) | 2025.01.07 |
[Java][캐스팅] int[] <-> ArrayList (1) | 2025.01.07 |