Hashtable은 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료구조이다. 내부적으로는 배열과 해시 함수를 기반으로 동작하며, 빠른 데이터 검색과 삽입을 지원한다. Java에서는 java.util.Hashtable 클래스로 제공되며, 동기화를 기본적으로 지원한다는 점에서 HashMap과 차이가 있다.
잠깐, 여기서 Hashtable 의 동기화란?
https://hgggny.tistory.com/entry/Hashtable%EC%9D%98-%EB%8F%99%EA%B8%B0%ED%99%94synchronization
Hashtable의 구조
Hashtable은 해시 함수(hash function)를 이용하여 데이터를 저장할 위치를 결정한다.
- 키를 해시 함수에 전달하여 해시값을 생성한다.
- 생성된 해시값을 배열의 인덱스로 변환한다.
- 해당 인덱스에 키-값 쌍을 저장한다.
이 구조를 통해 평균적으로 O(1)의 시간 복잡도로 데이터를 검색하거나 삽입할 수 있다. 그러나 해시 충돌(hash collision)이 발생할 경우, 처리 방식에 따라 성능이 저하될 수 있다.
주요 특징
- 동기화(Synchronization)
- Hashtable은 기본적으로 동기화를 지원하여 여러 스레드에서 안전하게 접근할 수 있다.
- 하지만 이로 인해 단일 스레드 환경에서는 HashMap보다 성능이 떨어질 수 있다.
- Null 키와 값 허용 불가
- Hashtable은 키와 값 모두에 대해 null을 허용하지 않는다.
- 이는 NullPointerException을 방지하고 안정적인 데이터 관리가 가능하도록 한다.
- 순서 보장 없음
- 데이터가 해시값에 따라 저장되므로 입력 순서와 출력 순서가 다를 수 있다.
Hashtable의 장단점
장점
- 동기화를 제공하므로 멀티스레드 환경에서 안전하다.
- 해시 구조를 사용하여 빠른 데이터 접근이 가능하다.
단점
- 동기화로 인해 단일 스레드 환경에서 성능이 떨어진다.
- HashMap 대비 유연성이 낮다(null 값 허용 불가 등).
Hashtable의 사용 예시
아래는 Hashtable의 기본적인 사용법을 보여주는 Java 코드이다:
import java.util.Hashtable;
public class HashtableExample {
public static void main(String[] args) {
Hashtable<Integer, String> hashtable = new Hashtable<>();
// 데이터 삽입
hashtable.put(1, "Apple");
hashtable.put(2, "Banana");
hashtable.put(3, "Cherry");
// 데이터 검색
System.out.println("Key 2의 값: " + hashtable.get(2));
// 데이터 제거
hashtable.remove(3);
System.out.println("Key 3 제거 후: " + hashtable);
}
}
Hashtable vs HashMap
특성 | Hashtable | HashMap |
동기화 | 동기화 지원 (Thread-safe) | 동기화 미지원 |
Null 허용 여부 | 키와 값 모두 null 불가 | 한개의 null 키와 다수의 null 값 허용 |
성능 | 상대적으로 느림 | 상대적으로 빠 |
Hashtable은 동기화가 필요한 멀티스레드 환경에서 유용한 자료구조이다.
그러나 최근에는 동기화 지원이 향상된 ConcurrentHashMap이 더 자주 사용되고 있다. 개발 환경과 요구사항에 맞는 자료구조를 선택하는 것이 중요하다.
'Java' 카테고리의 다른 글
효율적인 테스트 코드를 위한 도구 선택: AssertJ와 JUnit의 차이 (0) | 2025.01.10 |
---|---|
Hashtable의 동기화(synchronization) (0) | 2024.12.10 |
리스트 값을 교체할까, 추가할까? 자바 리스트 처리 방식의 이해 (1) | 2024.09.25 |
Map의 EntrySet(), 그거 어떻게 쓰는건데 ! map 을 순회하는 방법 (0) | 2024.09.24 |
@Nullable 어노테이션, warning: unknown enum constant When.MAYBE ! (0) | 2024.09.23 |