HashMap, HashTable, ConcurrentHashMap의 차이

유경우·2024년 3월 11일
0

CS

목록 보기
14/21
post-custom-banner

들어가기 전

Hashtable, HashMap, ConcurrentHashMap은 Java에서 맵(Map) 기능을 구현한 클래스들로, 유사한 기능을 제공하지만 세부적인 차이점이 있습니다. 각 클래스의 특징과 멀티스레드 환경에서의 사용 적합성, null 값 처리 방법 등을 알아보겠습니다.

Hashtable 클래스

특징

  • 동기화 지원: 모든 메서드에 synchronized 키워드가 존재합니다.
  • null 허용하지 않음: 키와 값으로 null을 허용하지 않습니다.
  • 멀티스레드 환경에서의 성능: 동시 작업 시 병목 현상으로 인해 성능 저하가 발생할 수 있습니다.

예시

Hashtable<String, Integer> table = new Hashtable<>();
table.put("key1", 1);
// table.put("key2", null); // NullPointerException 발생
Integer value = table.get("key1"); // value = 1

HashMap 클래스

특징

  • 동기화 미지원: 멀티스레드 환경에서 데이터 불일치 문제가 발생할 수 있습니다.
  • null 허용: 하나의 null 키와 여러 null 값들을 허용합니다.
  • 성능: Hashtable보다 성능이 우수합니다.

예시

HashMap<String, Integer> map = new HashMap<>();
map.put("key1", 1);
map.put(null, 2); // null 키 허용
map.put("key2", null); // null 값 허용
Integer value = map.get(null); // value = 2

ConcurrentHashMap 클래스

특징

  • 부분 동기화: 세그먼트 단위로 동기화하여 높은 동시성을 제공합니다.
  • null 허용하지 않음: 키와 값으로 null을 허용하지 않습니다.
  • 성능: Hashtable보다 더 나은 성능을 멀티스레드 환경에서 제공합니다.

예시

ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("key1", 1);
// concurrentMap.put(null, 2); // NullPointerException 발생
// concurrentMap.put("key2", null); // NullPointerException 발생
concurrentMap.putIfAbsent("key1", 2); // key1에 대한 값이 이미 존재하므로 업데이트되지 않음
Integer value = concurrentMap.get("key1"); // value = 1

결론

Hashtable은 오래된 클래스로 멀티스레드 환경에서의 thread-safe를 보장하지만, 동기화 때문에 성능 저하가 발생할 수 있습니다.

HashMap은 단일 스레드 환경에서 높은 성능을 제공하지만, 멀티스레드 환경에서는 데이터 불일치 문제가 발생할 수 있습니다.

ConcurrentHashMap은 Hashtable의 단점을 보완하며, 멀티스레드 환경에서 높은 성능과 thread-safe를 동시에 제공합니다.

동시성을 필요로 하는 상황에서는 ConcurrentHashMap이 최선의 선택입니다.

출처 : https://www.baeldung.com/java-synchronizedmap-vs-concurrenthashmap
https://devlog-wjdrbs96.tistory.com/269
https://tecoble.techcourse.co.kr/post/2021-11-26-hashmap-hashtable-concurrenthashmap/

profile
개발자
post-custom-banner

0개의 댓글