른록노트

[DataStructure] Hashtable(Java) 본문

Programming/[DataStructure]

[DataStructure] Hashtable(Java)

른록 2021. 12. 28. 19:52

1. Hashtable

Java 11

Module java.base
Package java.util

Class Hashtable<K,​V>

java.lang.Object
    java.util.Dictionary<K,​V>
        java.util.Hashtable<K,​V>

Type Parameters:
K - the type of keys maintained by this map
V - the type of mapped values

All Implemented Interfaces:
Serializable, Cloneable, Map<K,​V>

Direct Known Subclasses:
Properties, UIDefaults
public class Hashtable<K,​V>
extends Dictionary<K,​V>
implements Map<K,​V>, Cloneable, Serializable

2. 설명

이 클래스는 키를 값에 매핑하는 해시 테이블을 구현합니다. null이 아닌 모든 개체를 키 또는 값으로 사용할 수 있습니다.

해시 테이블에서 객체를 성공적으로 저장하고 검색하려면 키로 사용되는 객체가 hashCode 메서드와 equals 메서드를 구현해야 합니다.

Hashtable의 인스턴스에는 성능에 영향을 미치는 두 가지 매개변수가 있습니다. initial capacity(초기 용량)와 load factor(로드 팩터)입니다.
capacity은 해시 테이블에 있는 버킷의 수이며 초기 용량은 단순히 해시 테이블이 생성된 시점의 용량입니다.
해시 테이블이 열려 있다는 점에 유의하십시오. "해시 충돌"의 경우 단일 버킷에 여러 항목이 저장되므로 순차적으로 검색해야 합니다.
로드 팩터는 해시 테이블의 용량이 자동으로 증가하기 전에 해시 테이블이 얼마나 가득 차도록 허용되는지를 측정한 것입니다.
초기 용량 및 부하 계수 매개변수는 구현에 대한 힌트일 뿐입니다. rehash 메서드가 호출되는지 여부에 대한 정확한 세부 정보는 구현에 따라 다릅니다.

일반적으로 기본 부하 계수(.75)는 시간과 공간 비용 사이에 좋은 균형을 제공합니다. 값이 높을수록 공간 오버헤드가 줄어들지만 항목을 조회하는 시간 비용이 증가합니다(이는 get 및 put을 포함한 대부분의 Hashtable 작업에 반영됨).

초기 용량은 낭비되는 공간과 시간이 많이 소요되는 rehash 작업 간의 균형을 제어합니다. 초기 용량이 Hashtable이 포함할 최대 항목 수를 로드 계수로 나눈 값보다 크면 다시 해시 작업이 발생하지 않습니다. 그러나 초기 용량을 너무 높게 설정하면 공간이 낭비될 수 있습니다.

많은 항목을 해시 테이블로 만들어야 하는 경우 충분히 큰 용량으로 작성하면 테이블을 확장하는 데 필요한 자동 재해싱을 수행하는 것보다 항목을 더 효율적으로 삽입할 수 있습니다.

이 예는 숫자의 해시 테이블을 생성합니다. 숫자 이름을 키로 사용합니다.

Hashtable<String, Integer> numbers
     = new Hashtable<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);

번호를 검색하려면 다음 코드를 사용하세요.

Integer n = numbers.get("two");
if (n != null) {
  System.out.println("two = " + n);
}

이 클래스의 모든 "컬렉션 뷰 메소드"에 의해 리턴된 컬렉션의 iterator 메소드에 의해 리턴된 iterator는 fail-fast입니다:
반복자가 생성된 후 언제든지 Hashtable이 구조적으로 수정되면 반복자의 자체 제거 메서드를 통하지 않는 경우를 제외하고 반복자는 ConcurrentModificationException을 throw합니다.따라서 동시 수정에 직면하여 반복자는 미래의 불확실한 시간에 임의적이고 비결정적인 동작의 위험을 감수하기보다는 빠르고 깔끔하게 실패합니다. Hashtable의 키 및 요소 메서드에서 반환된 열거형은 빠른 속도가 아닙니다. 열거가 생성된 후 언제든지 Hashtable이 구조적으로 수정되면 열거 결과가 정의되지 않습니다.

iterator의 fail-fast 동작은 일반적으로 동기화되지 않은 동시 수정이 있는 경우 확실한 보장을 하는 것이 불가능하기 때문에 보장할 수 없습니다. Fail-fast iterator는 최선을 다해 ConcurrentModificationException을 발생시킵니다. 따라서 정확성을 위해 이 예외에 의존하는 프로그램을 작성하는 것은 잘못된 것입니다. 반복기의 빠른 실패 동작은 버그를 감지하는 데만 사용해야 합니다.

Java 2 플랫폼 v1.2부터 이 클래스는 Map 인터페이스를 구현하도록 개조되어 Java Collections Framework의 구성원이 되었습니다. 새로운 컬렉션 구현과 달리 Hashtable은 동기화됩니다. 스레드로부터 안전한 구현이 필요하지 않은 경우 Hashtable 대신 HashMap을 사용하는 것이 좋습니다. 스레드로부터 안전한 고도의 동시 구현이 필요한 경우 Hashtable 대신 ConcurrentHashMap을 사용하는 것이 좋습니다.

Since:
1.0
See Also:
Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, Serialized Form

반응형
Comments