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