본문 바로가기

Language/Java

[Java][Collections Framework 완전 정복] Map 인터페이스, Map.Entry 인터페이스

목차

  1. 개념 및 특징
  2. 구현체
  3. 메소드
  4. 중첩 클래스(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/