본문 바로가기

JAVA

[JAVA] Map을 구현하는 클래스 종류

자바 컬렉션 프레임워크 _ Map 인터페이스

 

 

1. HashMap

  • Map 컬렉션 클래스에서 가장 많이 사용되는 클래스이다.
  • Map의 특징처럼 키와 값을 묶어서 하나의 데이터(entry)로 저장한다.
  • 해싱(hasing)을 사용하기에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.
  • HashMap은 키(key)와 값(value)에 null을 허용한다.
  • 동기화를 보장하지 않는다.
  • 동기화 처리를 하지 않기 때문에 검색속도가 빠르다. But 신뢰성과 안정성이 떨어진다.
  • 싱글 쓰레드 환경에서 사용하는 것이 좋다. ( thread-safe하지 않기 때문)

 

 

2. HashTable

  • HashMap 클래스와 같은 동작을 하는 클래스이다.
  • 키와 값에 null을 허용하지 않는다.
  • 동기화를 보장한다.
  • 멀티 쓰레드 환경에서 사용할 수 있다. ( thread-safe하기 때문)

 

- 메서드를 호출하기 전에 쓰레드간 동기화 락을 걸기 때문에

  멀티 쓰레드 환경에서도 데이터 무결성을 보장한다.

  하지만 쓰레드간 동기화 락은 매우 느린 동작이다.

 

- Hashtable과 HashMap의 관계는 Vector와 ArrayList 관계와 같다.

  즉, 기존 코드와의 호환성 때문에 남아있는 것으로 Hashtable 클래스보다는 HashMap을 사용하는 것을 권장한다.

 

 

 

3. TreeMap

  • 키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리(Binary Search Tree)의 형태로 저장한다.
  • 데이터를 추가하거나 제거하는 동작은 매우 빠르다.
  • 데이터를 저장할 때 즉시 정렬함으로, 추가나 삭제가 HashMap보다 오래 걸린다.

But 정렬된 상태로 Map을 유지하거나 정렬된 데이터를 조회해야 하는 범위 검색인 경우 성능이 빠르다.

 

 

 

4. ConcurrentHashMap

  • key와 value에 null을 허용하지 않는다.
  • 동기화를 보장한다.
  • 멀티 쓰레드 환경에서 사용할 수 있다. ( thread-safe하기 때문)
  • HashTable보다 데이터 다루는 속도가 빠르다.

ConcurrentHashMap는 HashMap의 동기화 문제를 보완하기 위해 나온 것이다.

동기화 처리를 할 때 어떤 Entry를 조작하는 경우 해당 Entry만 락을 건다.

그래서 HashTable보다 데이터 다루는 속도가 빠르다.

 

즉, Entry 아이템별로 락을 걸어 멀티 쓰레드 환경에서의 성능을 향상시킨다.

 

 

 


Reference

https://ssdragon.tistory.com/70

https://velog.io/@baekgom/%EC%9E%90%EB%B0%94-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-Map-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4