본문 바로가기
프로그래밍/Java

[Java] HashMap vs HashTable vs ConcurrentHashMap의 차이

by 시간많은백수 2023. 10. 13.
반응형

HashMap, HashTable 및 ConcurrentHashMap은 모두 자바에서 사용되는 해시 맵 데이터 구조를 구현하는 클래스입니다. 이러한 클래스들은 키-값 쌍을 저장하고 검색하는 데 사용됩니다. 그러나 이러한 클래스 간에 중요한 차이점이 있습니다. 다음은 그 차이점에 대한 자세한 설명입니다

💡 Thread Safety (스레드 안전성)

  • HashMap: HashMap은 스레드 안전하지 않습니다. 따라서 동시에 여러 스레드에서 접근하거나 수정하려면 외부에서 동기화를 제공해야 합니다.
  • HashTable: HashTable은 스레드 안전하게 설계되었습니다. 모든 메서드가 스레드 안전하도록 동기화되어 있어 여러 스레드가 동시에 접근하더라도 데이터 일관성이 유지됩니다. 하지만 이로 인해 성능 저하가 발생할 수 있습니다.
  • ConcurrentHashMap: ConcurrentHashMap은 HashTable과 유사하게 스레드 안전하게 설계되었지만, 성능을 향상시키기 위해 분할 락(lock-striping) 및 세분화된 동기화 기법을 사용합니다. 이로 인해 동시성이 더 뛰어나며, 여러 스레드에서 동시에 읽기 및 쓰기 작업을 수행할 수 있습니다.

💡 Null Key 및 Value 허용 여부

  • HashMap: HashMap은 null 키와 null 값을 허용합니다. 즉, null 키와 null 값을 저장할 수 있습니다.
  • HashTable: HashTable은 null 키 또는 null 값을 허용하지 않습니다. null 키나 값을 저장하려고 하면 NullPointerException이 발생합니다.
  • ConcurrentHashMap: ConcurrentHashMap은 null 키 또는 null 값을 허용하지만 주의가 필요합니다. 동기화된 환경에서 null 값을 사용하는 경우 데이터 일관성 문제가 발생할 수 있습니다.

💡 속도 및 성능

  • HashMap: HashMap은 동기화되지 않기 때문에 단일 스레드 환경에서는 빠르게 동작합니다. 그러나 동시성 요구가 있는 멀티스레드 환경에서는 추가적인 동기화 작업이 필요하므로 ConcurrentHashMap에 비해 성능이 낮을 수 있습니다.
  • HashTable: HashTable은 모든 메서드가 동기화되어 있어 멀티스레드 환경에서 안전하지만, 성능이 낮을 수 있습니다.
  • ConcurrentHashMap: ConcurrentHashMap은 멀티스레드 환경에서 효율적으로 동작하며, 높은 동시성을 제공합니다.

💡 Iterator (반복자) 지원

  • HashMap: HashMap은 Iterator를 통해 안전하게 반복(iterate)할 수 있습니다.
  • HashTable: HashTable도 Iterator를 통해 안전하게 반복(iterate)할 수 있습니다.
  • ConcurrentHashMap: ConcurrentHashMap은 안전한 반복자를 제공하며, 동시성 수정을 허용하지 않는 Iterator를 사용할 수 있습니다.
  HASHMAP HASHTABLE CONCURRENTHASHMAP
key와 value에 null 허용 O X X
동기화 보장(Thread-safe) X O O
추천 환경 싱글 쓰레드 멀티 쓰레드 멀티 쓰레드

 

일반적으로, ConcurrentHashMap은 멀티스레드 환경에서 가장 안전하며 높은 성능을 제공하는 선택지입니다. 그러나 단일 스레드 환경이거나 스레드 안전성이 필요하지 않은 경우에는 HashMap을 고려할 수 있습니다. HashTable은 거의 사용되지 않으며, 대체로 ConcurrentHashMap 또는 HashMap을 사용하는 것이 권장됩니다.

반응형