그만큼 해시테이블 클래스는 키를 값에 매핑하는 해시 테이블을 구현합니다. null이 아닌 모든 객체는 키나 값으로 사용될 수 있습니다. 해시테이블에서 객체를 성공적으로 저장하고 검색하려면 키로 사용되는 객체가 hashCode 메서드와 equals 메서드를 구현해야 합니다.
java.util.Hashtable 클래스는 Map 인터페이스와 유사한 키-값 데이터 구조를 제공하는 Java의 클래스입니다. 이는 원래 Java 컬렉션 프레임워크의 일부였으며 Java 1.0에서 도입되었습니다.
그러나 Hashtable 클래스는 이후 더 이상 사용되지 않는 것으로 간주되어 일반적으로 사용이 권장되지 않습니다. 이는 Collections 프레임워크 도입 이전에 설계되었으며 Map 인터페이스를 구현하지 않아 프레임워크의 다른 부분과 함께 사용하기 어렵기 때문입니다. 또한 Hashtable 클래스가 동기화되므로 다른 Map 인터페이스 구현에 비해 성능이 저하될 수 있습니다.
일반적으로 Hashtable 클래스 대신 Map 인터페이스나 해당 구현(예: HashMap 또는 ConcurrentHashMap) 중 하나를 사용하는 것이 좋습니다.
다음은 Hashtable 클래스를 사용하는 방법에 대한 예입니다.
자바
import> java.util.Enumeration;> import> java.util.Hashtable;> public> class> Main {> >public> static> void> main(String[] args) {> >Hashtable hashtable =>new> Hashtable();> >// Adding elements to the hashtable> >hashtable.put(>'A'>,>1>);> >hashtable.put(>'B'>,>2>);> >hashtable.put(>'C'>,>3>);> >// Getting values from the hashtable> >int> valueA = hashtable.get(>'A'>);> >System.out.println(>'Value of A: '> + valueA);> >// Removing elements from the hashtable> >hashtable.remove(>'B'>);> >// Enumerating the elements of the hashtable> >Enumeration keys = hashtable.keys();> >while> (keys.hasMoreElements()) {> >String key = keys.nextElement();> >System.out.println(>'Key: '> + key +>', Value: '> + hashtable.get(key));> >}> >}> }> |
>
>산출
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>
결론적으로 Hashtable 클래스는 여전히 Java에 존재하고 사용할 수 있지만 일반적으로 Map 인터페이스나 그 구현 중 하나를 대신 사용하는 것이 좋습니다.
해시테이블의 특징
자바 mvc
- HashMap과 유사하지만 동기화됩니다.
- Hashtable은 해시 테이블에 키/값 쌍을 저장합니다.
- Hashtable에서는 키로 사용되는 객체와 해당 키에 연결하려는 값을 지정합니다. 그런 다음 키가 해시되고 결과 해시 코드가 테이블 내에 값이 저장되는 인덱스로 사용됩니다.
- Hashtable 클래스의 초기 기본 용량은 11이고, loadFactor는 0.75입니다.
- HashMap은 열거형을 제공하지 않지만 Hashtable은 빠른 열거형을 제공하지 않습니다.
선언:
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable>
유형 매개변수:
- 케이 – 이 맵에 의해 유지되는 키 유형
- 안에 – 매핑된 값의 유형
해시테이블의 계층 구조

해시테이블 구현 직렬화 가능 , 복제 가능 , 지도 인터페이스 및 확장 사전 . 직접적인 하위 클래스는 Properties 입니다. UIDefaults .
생성자:
해시테이블을 생성하려면 다음에서 가져와야 합니다. java.util.Hashtable . Hashtable을 생성하는 방법에는 여러 가지가 있습니다.
1. 해시테이블(): 그러면 기본 로드 비율이 0.75이고 초기 용량이 11인 빈 해시테이블이 생성됩니다.
해시테이블 ht = new Hashtable();
자바
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> >public> static> void> main(String args[])> >{> >// No need to mention the> >// Generic type twice> >Hashtable ht1 =>new> Hashtable();> >// Initialization of a Hashtable> >// using Generics> >Hashtable ht2> >=>new> Hashtable();> >// Inserting the Elements> >// using put() method> >ht1.put(>1>,>'one'>);> >ht1.put(>2>,>'two'>);> >ht1.put(>3>,>'three'>);> >ht2.put(>4>,>'four'>);> >ht2.put(>5>,>'five'>);> >ht2.put(>6>,>'six'>);> >// Print mappings to the console> >System.out.println(>'Mappings of ht1 : '> + ht1);> >System.out.println(>'Mappings of ht2 : '> + ht2);> >}> }> |
>
>산출
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}> 2. 해시테이블(intinitialCapacity): 이는initialCapacity로 지정된 초기 크기를 갖고 기본 로드 계수가 0.75인 해시 테이블을 생성합니다.
Hashtable ht = new Hashtable(intinitialCapacity);
자바
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> >public> static> void> main(String args[])> >{> >// No need to mention the> >// Generic type twice> >Hashtable ht1 =>new> Hashtable(>4>);> >// Initialization of a Hashtable> >// using Generics> >Hashtable ht2> >=>new> Hashtable(>2>);> >// Inserting the Elements> >// using put() method> >ht1.put(>1>,>'one'>);> >ht1.put(>2>,>'two'>);> >ht1.put(>3>,>'three'>);> >ht2.put(>4>,>'four'>);> >ht2.put(>5>,>'five'>);> >ht2.put(>6>,>'six'>);> >// Print mappings to the console> >System.out.println(>'Mappings of ht1 : '> + ht1);> >System.out.println(>'Mappings of ht2 : '> + ht2);> >}> }> |
>
>산출
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {4=four, 6=six, 5=five}> 3. 해시테이블(int 크기, float fillRatio): 이 버전은 size로 지정된 초기 크기와 fillRatio로 지정된 채우기 비율을 갖는 해시 테이블을 생성합니다. 채우기 비율: 기본적으로 해시 테이블의 크기가 위쪽으로 조정되기 전에 해시 테이블이 얼마나 가득 찰 수 있는지 결정하고 해당 값은 0.0에서 1.0 사이에 있습니다.
Hashtable ht = new Hashtable(int size, float fillRatio);
자바
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> >public> static> void> main(String args[])> >{> >// No need to mention the> >// Generic type twice> >Hashtable ht1> >=>new> Hashtable(>4>,>0>.75f);> >// Initialization of a Hashtable> >// using Generics> >Hashtable ht2> >=>new> Hashtable(>3>,>0>.5f);> >// Inserting the Elements> >// using put() method> >ht1.put(>1>,>'one'>);> >ht1.put(>2>,>'two'>);> >ht1.put(>3>,>'three'>);> >ht2.put(>4>,>'four'>);> >ht2.put(>5>,>'five'>);> >ht2.put(>6>,>'six'>);> >// Print mappings to the console> >System.out.println(>'Mappings of ht1 : '> + ht1);> >System.out.println(>'Mappings of ht2 : '> + ht2);> >}> }> |
>
>산출
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}> 4. 해시테이블(Map m): 이는 m의 요소로 초기화되는 해시 테이블을 생성합니다.
해시테이블 ht = new Hashtable(Map m);
자바
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> >public> static> void> main(String args[])> >{> >// No need to mention the> >// Generic type twice> >Map hm =>new> HashMap();> >// Inserting the Elements> >// using put() method> >hm.put(>1>,>'one'>);> >hm.put(>2>,>'two'>);> >hm.put(>3>,>'three'>);> >// Initialization of a Hashtable> >// using Generics> >Hashtable ht2> >=>new> Hashtable(hm);> >// Print mappings to the console> >System.out.println(>'Mappings of ht2 : '> + ht2);> >}> }> |
>
>산출
Mappings of ht2 : {3=three, 2=two, 1=one}> 예:
자바
// Java program to illustrate> // Java.util.Hashtable> import> java.util.*;> public> class> GFG {> >public> static> void> main(String[] args)> >{> >// Create an empty Hashtable> >Hashtable ht =>new> Hashtable();> >// Add elements to the hashtable> >ht.put(>'vishal'>,>10>);> >ht.put(>'sachin'>,>30>);> >ht.put(>'vaibhav'>,>20>);> >// Print size and content> >System.out.println(>'Size of map is:- '> + ht.size());> >System.out.println(ht);> >// Check if a key is present and if> >// present, print value> >if> (ht.containsKey(>'vishal'>)) {> >Integer a = ht.get(>'vishal'>);> >System.out.println(>'value for key'> >+>' 'vishal' is:- '> + a);> >}> >}> }> |
>
>산출
Size of map is:- 3 {vaibhav=20, vishal=10, sachin=30} value for key 'vishal' is:- 10> 해시테이블에서 다양한 작업 수행
1. 요소 추가: 해시테이블에 요소를 추가하려면 put() 메소드를 사용할 수 있습니다. 그러나 삽입 순서는 해시테이블에 유지되지 않습니다. 내부적으로 모든 요소에 대해 별도의 해시가 생성되고 이 해시를 기반으로 요소가 인덱싱되어 더욱 효율적으로 만들어집니다.
자바
// Java program to demonstrate> // adding elements to Hashtable> import> java.io.*;> import> java.util.*;> class> AddElementsToHashtable {> >public> static> void> main(String args[])> >{> >// No need to mention the> >// Generic type twice> >Hashtable ht1 =>new> Hashtable();> >// Initialization of a Hashtable> >// using Generics> >Hashtable ht2> >=>new> Hashtable();> >// Inserting the Elements> >// using put() method> >ht1.put(>1>,>'Geeks'>);> >ht1.put(>2>,>'For'>);> >ht1.put(>3>,>'Geeks'>);> >ht2.put(>1>,>'Geeks'>);> >ht2.put(>2>,>'For'>);> >ht2.put(>3>,>'Geeks'>);> > >// Print mappings to the console> >System.out.println(>'Mappings of ht1 : '> + ht1);> >System.out.println(>'Mappings of ht2 : '> + ht2);> >}> }> |
>
>산출
Mappings of ht1 : {3=Geeks, 2=For, 1=Geeks} Mappings of ht2 : {3=Geeks, 2=For, 1=Geeks}> 2. 요소 변경: 요소를 추가한 후 요소를 변경하려면 put() 메서드를 사용하여 요소를 다시 추가하면 됩니다. 해시테이블의 요소는 키를 사용하여 인덱싱되므로 변경하려는 키에 대해 업데이트된 값을 삽입하기만 하면 키 값을 변경할 수 있습니다.
자바
// Java program to demonstrate> // updating Hashtable> import> java.io.*;> import> java.util.*;> class> UpdatesOnHashtable {> >public> static> void> main(String args[])> >{> >// Initialization of a Hashtable> >Hashtable ht> >=>new> Hashtable();> >// Inserting the Elements> >// using put method> >ht.put(>1>,>'Geeks'>);> >ht.put(>2>,>'Geeks'>);> >ht.put(>3>,>'Geeks'>);> > >// print initial map to the console> >System.out.println(>'Initial Map '> + ht);> > >// Update the value at key 2> >ht.put(>2>,>'For'>);> > >// print the updated map> >System.out.println(>'Updated Map '> + ht);> >}> }> |
>
>산출
Initial Map {3=Geeks, 2=Geeks, 1=Geeks} Updated Map {3=Geeks, 2=For, 1=Geeks}> 3. 요소 제거: Map에서 요소를 제거하려면 Remove() 메서드를 사용할 수 있습니다. 이 메소드는 키 값을 가져와 맵에 키가 있는 경우 이 맵에서 키에 대한 매핑을 제거합니다.
자바
// Java program to demonstrate> // the removing mappings from Hashtable> import> java.io.*;> import> java.util.*;> class> RemovingMappingsFromHashtable {> >public> static> void> main(String args[])> >{> >// Initialization of a Hashtable> >Map ht> >=>new> Hashtable();> >// Inserting the Elements> >// using put method> >ht.put(>1>,>'Geeks'>);> >ht.put(>2>,>'For'>);> >ht.put(>3>,>'Geeks'>);> >ht.put(>4>,>'For'>);> >// Initial HashMap> >System.out.println(>'Initial map : '> + ht);> >// Remove the map entry with key 4> >ht.remove(>4>);> >// Final Hashtable> >System.out.println(>'Updated map : '> + ht);> >}> }> |
>
>산출
Initial map : {4=For, 3=Geeks, 2=For, 1=Geeks} Updated map : {3=Geeks, 2=For, 1=Geeks}> 4. 해시테이블 순회: 테이블을 반복하기 위해 다음을 사용할 수 있습니다. 고급 for 루프 . 다음은 해시테이블을 반복하는 예입니다.
자바
// Java program to illustrate> // traversal of Hashtable> import> java.util.Hashtable;> import> java.util.Map;> public> class> IteratingHashtable {> >public> static> void> main(String[] args)> >{> >// Create an instance of Hashtable> >Hashtable ht =>new> Hashtable();> >// Adding elements using put method> >ht.put(>'vishal'>,>10>);> >ht.put(>'sachin'>,>30>);> >ht.put(>'vaibhav'>,>20>);> > >// Iterating using enhanced for loop> >for> (Map.Entry e : ht.entrySet())> >System.out.println(e.getKey() +>' '> >+ e.getValue());> >}> }> |
>
안드로이드의 imessage 게임
>산출
vaibhav 20 vishal 10 sachin 30>
해시테이블의 내부 작업
해시테이블 데이터 구조는 키/값 쌍을 저장하는 버킷 배열입니다. 그것은 활용한다 hashCode() 메서드 키/값 쌍이 매핑해야 하는 버킷을 결정합니다.
해시 함수는 버킷 목록에서 특정 키의 위치를 결정하는 데 도움이 됩니다. 일반적으로 해시코드는 동일한 객체에 대해 동일하고 동일하지 않은 객체에 대해 동일하거나 동일하지 않을 수 있는 음수가 아닌 정수입니다. 두 객체가 같은지 여부를 확인하기 위해 해시테이블은 equals() 메서드를 사용합니다.
두 개의 동일하지 않은 객체가 동일한 해시코드를 가질 가능성이 있습니다. 이것은 충돌 . 충돌을 해결하기 위해 해시테이블은 목록 배열을 사용합니다. 단일 버킷(배열 인덱스)에 매핑된 쌍은 목록에 저장되고 목록 참조는 배열 인덱스에 저장됩니다.

해시테이블의 방법
- 케이 – 맵의 키 유형.
- 안에 – 맵에 매핑된 값의 유형입니다.
| 방법 | 설명 |
|---|---|
| 분명한() | 키가 포함되지 않도록 이 해시테이블을 지웁니다. |
| 클론() | 이 해시 테이블의 얕은 복사본을 만듭니다. |
| 계산(K 키, BiFunction 케이,? 슈퍼V,? V> remappingFunction 확장) | 지정된 키와 현재 매핑된 값(또는 현재 매핑이 없는 경우 null)에 대한 매핑을 계산하려고 시도합니다. |
| 계산IfAbsent(K 키, 함수 V> 매핑 기능 확장) | 지정된 키가 아직 값과 연결되지 않은 경우(또는 null에 매핑된 경우) 지정된 매핑 함수를 사용하여 해당 값을 계산하려고 시도하고 null이 아닌 한 이 맵에 입력합니다. |
| ComputeIfPresent(K 키, BiFunction remappingFunction) | 지정된 키의 값이 존재하고 null이 아닌 경우 키와 현재 매핑된 값을 바탕으로 새 매핑을 계산하려고 시도합니다. |
| 포함(객체 값) | 일부 키가 이 해시테이블의 지정된 값에 매핑되는지 테스트합니다. |
| containKey(객체 키) | 지정된 객체가 이 해시테이블의 키인지 테스트합니다. |
| containValue(객체 값) | 이 해시테이블이 하나 이상의 키를 이 값에 매핑하면 true를 반환합니다. |
| 강요() | 이 해시테이블에 있는 값의 열거형을 반환합니다. |
| 엔트리셋() | 이 맵에 포함된 매핑의 Set 뷰를 반환합니다. |
| 같음(객체 o) | Map 인터페이스의 정의에 따라 지정된 Object와 이 Map이 동일한지 비교합니다. |
| get(객체 키) | 지정된 키가 매핑된 값을 반환하거나, 이 맵에 키에 대한 매핑이 포함되어 있지 않으면 null을 반환합니다. |
| 해시 코드() | Map 인터페이스의 정의에 따라 이 지도의 해시 코드 값을 반환합니다. |
| 비었다() | 이 해시테이블이 값에 키를 매핑하지 않는지 테스트합니다. |
| 키() | 이 해시테이블에 있는 키의 열거를 반환합니다. |
| 키세트() | 이 맵에 포함된 키의 Set 뷰를 반환합니다. |
| merge(K 키, V 값, BiFunction remappingFunction) | 지정된 키가 아직 값과 연결되어 있지 않거나 null과 연결된 경우 해당 키를 지정된 null이 아닌 값과 연결합니다. |
| put(K 키, V 값) | 지정된 키를 이 해시테이블의 지정된 값에 매핑합니다. |
| putAll(맵 t) | 지정된 맵의 모든 매핑을 이 해시테이블에 복사합니다. |
| 다시 만들다() | 해당 항목을 보다 효율적으로 수용하고 액세스하기 위해 이 해시테이블의 용량을 늘리고 내부적으로 재구성합니다. |
| 제거(객체 키) | 이 해시테이블에서 키(및 해당 값)를 제거합니다. |
| 크기() | 이 해시테이블의 키 수를 반환합니다. |
| toString() | 중괄호로 묶이고 ASCII 문자(쉼표와 공백)로 구분된 항목 집합 형태로 이 Hashtable 개체의 문자열 표현을 반환합니다. |
| 값() | 이 맵에 포함된 값의 컬렉션 뷰를 반환합니다. |
인터페이스 java.util.Map에 선언된 메소드
| 방법 | 설명 |
|---|---|
| forEach(BiConsumer 작업) | 모든 항목이 처리되거나 작업에서 예외가 발생할 때까지 이 맵의 각 항목에 대해 지정된 작업을 수행합니다. |
| getOrDefault(객체 키, V defaultValue) | 지정된 키가 매핑된 값을 반환하거나, 이 맵에 키에 대한 매핑이 포함되어 있지 않은 경우 defaultValue를 반환합니다. |
| putIfAbsent(K 키, V 값) | 지정된 키가 아직 값과 연결되지 않은 경우(또는 null에 매핑된 경우) 해당 키를 지정된 값과 연결하고 null을 반환하고, 그렇지 않으면 현재 값을 반환합니다. |
| 제거(객체 키, 개체 값) | 현재 지정된 값에 매핑된 경우에만 지정된 키에 대한 항목을 제거합니다. |
| 교체(K 키, V 값) | 현재 일부 값에 매핑된 경우에만 지정된 키에 대한 항목을 바꿉니다. |
| 교체(K 키, V oldValue, V newValue) | 현재 지정된 값에 매핑된 경우에만 지정된 키에 대한 항목을 바꿉니다. |
| replacementAll(BiFunction 함수) | 모든 항목이 처리되거나 함수에서 예외가 발생할 때까지 각 항목의 값을 해당 항목에 대해 지정된 함수를 호출한 결과로 바꿉니다. |
꼭 읽어야 할 내용:
- Java에서 HashMap과 HashTable의 차이점
해시테이블의 장점:
- 스레드로부터 안전함: Hashtable 클래스는 스레드로부터 안전합니다. 즉, 데이터 손상이나 기타 동기화 문제를 일으키지 않고 여러 스레드가 동시에 액세스할 수 있습니다.
- 사용이 간편함: Hashtable 클래스는 사용이 간편하며 간단한 경우에 유용할 수 있는 기본 키-값 데이터 구조 기능을 제공합니다.
해시테이블의 단점:
- 폐기됨: Hashtable 클래스는 폐기된 것으로 간주되며 일반적으로 사용이 권장되지 않습니다. 이는 Collections 프레임워크 도입 이전에 설계되었으며 Map 인터페이스를 구현하지 않아 프레임워크의 다른 부분과 함께 사용하기 어렵기 때문입니다.
- 제한된 기능: Hashtable 클래스는 기본 키-값 데이터 구조 기능을 제공하지만 Map 인터페이스 및 해당 구현에서 사용할 수 있는 전체 기능 범위를 제공하지는 않습니다.
- 성능 저하: Hashtable 클래스가 동기화되어 HashMap 또는 ConcurrentHashMap과 같은 Map 인터페이스의 다른 구현에 비해 성능이 저하될 수 있습니다.
참고 도서:
- Maurice Naftalin과 Philip Wadler의 Java 컬렉션. 이 책은 Hashtable 클래스를 포함하여 Java 컬렉션 프레임워크에 대한 포괄적인 개요를 제공합니다.
- David Flanagan이 쓴 Java in 간단히 말해서. 이 책은 Hashtable 클래스를 포함하여 Java의 핵심 기능에 대한 빠른 참조를 제공합니다.
- Maurice Naftalin과 Philip Wadler가 작성한 Java Generics 및 컬렉션. 이 책은 Hashtable 클래스를 포함하여 Java의 제네릭과 컬렉션에 대한 포괄적인 가이드를 제공합니다.
참조: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html