Map과 TreeMap, HashMap, Multimap

Gunjoo Ahn·2022년 8월 27일
0

자바에서 제공하는 컬렉션 프레임워크 중 하나로 Map이 있다. Collection의 상속을 받지는 않는다.

💡 An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value. - oracle

Map은 Key와 Value로 나누어서 데이터를 관리한다. 순서는 구현체에 따라 다르며, 키에 대한 중복은 없다.

Map은 인터페이스며 그 구현체로 TreeMap, HashMap, Hashtable 등이 있다.

Map 인터페이스는 링크로 대체한다. Java 1.8이다.

Map (Java Platform SE 8 )

TreeMap


레드 블랙 트리 베이스로 구현되었다.

키는 저장 시 오름차순으로 정렬된다.

레드 블랙 트리의 삽입 삭제는 hash map보다 성능이 떨어진다. (자신이 들어갈 위치 탐색 + 트리 밸런싱)

정렬된 상태로 map을 유지해야한다면 hash map보다 낫다

💡 Note that this implementation is not synchronized. If multiple threads access a map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

HashMap


해시 테이블 베이스로 구현되었다.

순서가 없으며, 키와 값이 null 값인 것을 허용한다.

해시 함수를 이용하기에 삽입, 삭제, 검색이 빠르다.

💡 Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.

Map m = Collections.synchronizedMap(new HashMap(...));

MultiMap


Java에서 공식 구현체는 없는 것으로 알고있다. google에서 제공하는 Multimap 구현체를 사용하면 가능하다. guava 라이브러리를 통하여 사용가능하다.

기존 Map은 단일 키, 단일 값이 원칙이었다. 하지만 Multimap은 단일 키에 여러 키를 매핑시킬 수 있다.

직접 구현하는 방법도 있는데, 기존 Map에 값을 Collection으로 가지는 것이다. 사실 guava에서도 이렇게 구현되어 있을 것이지만, Map Interface로 쓰기 편하게 구현한 것이다.

직접 Map에 Collection을 할당하여 Multimap을 사용한다면, Map Interface 만으로는 키에 해당하는 값을 넣으면 할당했던 Collection이 바뀌는 것뿐이다. 따라서 값이 가지고 있는 Collection에 add를 하도록 로직을 짜야하는데 이를 guava가 Map interface로 사용하게 편하게 만든 것이다.

Reference

Java Map - HashMap, TreeMap, LinkedHashMap 비교, 차이점
[Guava] Multimap 예제

profile
Backend Developer

0개의 댓글