IT 개발 라이프/Back_End

자바 HashMap vs HashTable vs ConcurrentHashMap

10Biliion 2024. 12. 31. 09:35

🌟 공통점

  • 키와 값의 쌍으로 데이터를 저장합니다.
  • Map 인터페이스를 구현하여 키를 사용해 값을 빠르게 조회할 수 있습니다.
  • 키는 중복 불가하고, 각 키는 하나의 값에만 매핑됩니다.

하지만 이 세 클래스는 사용 목적과 동작 방식에서 큰 차이를 보입니다. 


1️⃣ HashMap

🧐 특징

  • 비동기적: 멀티스레드 환경에서 안전하지 않음.
  • Null 허용: 하나의 null 키와 여러 null 값을 허용합니다.
  • 성능 최적화: 동기화를 지원하지 않기 때문에 단일 스레드 환경에서 빠른 성능을 자랑합니다.

📖 예제

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put(null, 3);
        System.out.println(map);
    }
}

출력:

{null=3, A=1, B=2}

2️⃣ HashTable

🧐 특징

  • 동기화 지원: 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
  • Null 비허용: 키와 값 모두 null을 허용하지 않습니다.
  • 오래된 클래스: HashMap보다 성능이 떨어지며, 현재는 사용되지 않습니다.

📖 예제

import java.util.Hashtable;

public class HashTableExample {
    public static void main(String[] args) {
        Hashtable<String, Integer> table = new Hashtable<>();
        table.put("A", 1);
        table.put("B", 2);
        // table.put(null, 3); // NullPointerException 발생
        System.out.println(table);
    }
}

출력:

{A=1, B=2}

3️⃣ ConcurrentHashMap

🧐 특징

  • 고성능 동기화: 멀티스레드 환경에서도 높은 성능을 유지합니다.
    • 내부적으로 분할 잠금(lock) 메커니즘을 사용합니다.
  • Null 비허용: 키와 값 모두 null을 허용하지 않습니다.
  • Java 1.5부터 추가.

📖 예제

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> cmap = new ConcurrentHashMap<>();
        cmap.put("A", 1);
        cmap.put("B", 2);
        // cmap.put(null, 3); // NullPointerException 발생
        System.out.println(cmap);
    }
}

출력:

{A=1, B=2}

📊 비교표

특성 HashMap HashTable ConcurrentHashMap
동기화 ❌ 비동기적 ✅ 동기화 지원 ✅ 고성능 동기화
Null 허용 여부 ✅ 허용 ❌ 비허용 ❌ 비허용
성능 빠름 느림 멀티스레드에서 빠름
사용 시점 단일 스레드 레거시 코드 멀티스레드 환경

🔍 어떤 것을 선택해야 할까?

  1. 단일 스레드 환경: HashMap을 사용하세요. 성능이 가장 좋습니다.
  2. 멀티스레드 환경:
    • 낮은 동시성 요구: Collections.synchronizedMap(new HashMap<>())를 사용할 수 있습니다.
    • 높은 동시성 요구: ConcurrentHashMap
  3. 레거시 코드:HashTable은 이제 사용하지 않습니다. ConcurrentHashMap으로 바꾸세요.
 

'IT 개발 라이프 > Back_End' 카테고리의 다른 글

디자인 패턴 이란? + 예시  (0) 2025.01.03
자바(JAVA) try-with-resources  (0) 2024.12.31
자바에서 Generic을 쓰는 이유  (1) 2024.12.27
@Component와 @Configuration란?  (1) 2024.12.26
자바(Java)의 메모리 영역  (1) 2024.12.19