모래블로그

Map, MultiValueMap의 차이 본문

Language/Java

Map, MultiValueMap의 차이

별모래 2024. 6. 11. 15:00
728x90

Collection

데이터를 모아서 관리할 수 있는 클래스를 컬렉션이라고 한다.

 

컬렉션은 그 타입에 따라 내부에 데이터를 저장하는 구조와 처리하는 방법이 다르다.

내부에서 처리하는 방법에 따라 데이터의 탐색이 빠른 경우가 있고, 추가/제거가 빠른 경우가 있다.

따라서 사용하는 컬렉션의 특성을 잘 알고 사용해야 불필요한 성능 저하를 피할 수 있다.

 

자바에서 제공하는 컬렉션의 대표적인 예로는 List, Set, Map 등이 있다.

 


Map

키와 값의 쌍(Key-Value) 을 저장하는 데이터 구조 이다.

 

Map 은 그 내부 구현 방식에 따라 HashMap, TreeMap, LinkedHashMap 등으로 나뉜다.

 

 

1. HashMap

 

Map의 기본형식이다.

 

중복된 키가 존재하지 않는다.

(각 키는 유일해야 하고 각 키에는 하나의 값만 대응된다.)

 

HashMap은 내부적으로 해싱을 이용하여 데이터를 관리하고 접근한다.

(여기서 해싱이란 키를 배열의 인덱스로 변환하는 과정을 말함)

 

Map에 있는 데이터를(value 값) 뽑을 때, key 를 기준으로 가져온다.

마치 key 를 리스트나 배열에 존재하는 idx(인덱스)처럼 가져와 value 값을 뽑기 때문에(키를 배열 인덱스로 효율적으로 변환해주므로),

평균적으로 모든 작업(삽입, 검색, 삭제)에 대한 시간복잡도가 O(1)이다. 

단, 최악의 경우(모든 요소가 하나의 해시 버킷에 위치할 때)에는 시간복잡도 O(n)이 소요될 수 있다.

Map<String, String> map = new HashMap<String, String>();

map.put("key1", "value1");
map.put("key2", "value2");

System.out.println(map.get("key1"));

 

"key1"이라는 Key 값과 "value1"이라는 Value 값을 갖는 Entry가 HashMap 내부에 put() 메소드를 통해 저장된다.

나중에 해당 값을 가져올 때에는 Key 값인 "key1" 이라는 문자열만 넘겨주면 Value 값을 얻어올 수 있는 형태의 컬렉션이다.

 

여기서 key는 중복될 수 없지만 값인 value는 중복 저장될 수 있다.
만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

 

 

2. TreeMap

 

TreeMap은 내부적으로 Red-Black Tree라는 자료구조를 사용하여 키-값 쌍을 저장한다.

이 특징 때문에 TreeMap은 모든 요소를 자동으로 정렬된 순서로 유지하며, 특정 조건에 따라 키를 순서대로 정렬할 수 있다.

 

TreeMap은 삽입, 삭제, 검색 작업에 대해 시간 복잡도는 일반적으로 O(log n) 이다.

이는 트리 구조를 통해 중간에 요소를 추가하거나 제거할 때 트리를 재균형화하는 과정 때문이다.

 

TreeMap은 키-값 쌍을 정렬된 순서로 관리할 필요가 있을 때 특히 유용하다.

 

3. LinkedHashMap

 

LinkedHashMap의 주요 특징은 HashMap의 모든 기능을 유지하면서도 입력순서를 보장한다.

 

예를 들어, HashMap은 입력을  C B A 로 했다면, 나중에 맵에 있는 모든 값을 출력할 때 그대로 C B A로 나온다는 보장이 없다. 

LinkedHashMap은 이와 같은 문제를 해결해준다.

 

LinkedHashMap은 HashMap과 같이 대부분의 작업에 대해시간 복잡도 O(1)을 제공한다.

다만, LinkedHashMap은 추가적인 메모리를 사용하여 요소의 순서 정보를 관리한다.

 


MultiValueMap

MultiValueMap은 한 키에 여러 값을 연결할 수 있는 데이터 구조이다.

Map<K, List<V>> 또는 Map<K, Set<V>>와 유사한 형태로, 하나의 키에 대해 여러 값을 가질 수 있다.

 

이 구조는 주로 키 하나에 여러 값이 필요할 때 사용된다.

예를 들어, 하나의 사용자가 여러 이메일 주소를 가질 수 있을 때 유용하다.

MultiValueMap<String, Integer> multiMap = new LinkedMultiValueMap<>();
multiMap.add("apple", 1);
multiMap.add("apple", 2);

여기서 "apple"은 1과 2라는 두 개의 값에 연결된다.

 

즉, Map과 MultiValueMap의 기본적인 차이점은

Map이 한 키에 하나의 값을 저장하는 반면, MultiValueMap은 한 키에 여러 값을 저장할 수 있다는 점이다.

이로 인해 MultiValueMap은 더 복잡한 데이터 구조를 관리할 때 유용하게 사용될 수 있다.

 


Reference

https://velog.io/@kimunche/HashMap-TreeMap-%EC%B0%A8%EC%9D%B4%EB%A5%BC-%EC%95%8C%EC%95%84boza

https://taehoung0102.tistory.com/182

 

728x90

'Language > Java' 카테고리의 다른 글

[Java] Object toString()  (4) 2024.07.23
[Java] java.lang 패키지  (0) 2024.07.15
JAVA (자바)  (0) 2023.11.22