The Hashtable class implementuje tablicę mieszającą, która mapuje klucze na wartości. Jako klucz lub wartość można użyć dowolnego obiektu o wartości innej niż null. Aby pomyślnie przechowywać i pobierać obiekty z tablicy mieszającej, obiekty używane jako klucze muszą implementować metody hashCode i metody równości.
Klasa java.util.Hashtable to klasa w języku Java udostępniająca strukturę danych typu klucz-wartość, podobną do interfejsu Map. Była częścią oryginalnego frameworka Java Collections i została wprowadzona w Javie 1.0.
Jednak od tego czasu klasę Hashtable uznano za przestarzałą i ogólnie odradza się jej używanie. Dzieje się tak dlatego, że został on zaprojektowany przed wprowadzeniem frameworka Collections i nie implementuje interfejsu Map, co utrudnia jego użycie w połączeniu z innymi częściami frameworka. Dodatkowo synchronizowana jest klasa Hashtable, co może skutkować mniejszą wydajnością w porównaniu z innymi implementacjami interfejsu Map.
Ogólnie rzecz biorąc, zamiast klasy Hashtable zaleca się użycie interfejsu Map lub jednej z jego implementacji (takich jak HashMap lub ConcurrentHashMap).
Oto przykład użycia klasy Hashtable:
Jawa
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));> >}> >}> }> |
>
>Wyjście
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>
Podsumowując, chociaż klasa Hashtable nadal istnieje w Javie i nadal można z niej korzystać, ogólnie zaleca się zamiast niej korzystanie z interfejsu Map lub jednej z jego implementacji.
Funkcje Hashtable
- Jest podobny do HashMap, ale jest zsynchronizowany.
- Hashtable przechowuje parę klucz/wartość w tabeli skrótów.
- W Hashtable określamy obiekt używany jako klucz i wartość, którą chcemy powiązać z tym kluczem. Następnie klucz jest szyfrowany, a powstały kod skrótu służy jako indeks, pod którym wartość jest przechowywana w tabeli.
- Początkowa domyślna pojemność klasy Hashtable wynosi 11, podczas gdy LoadFactor wynosi 0,75.
- HashMap nie zapewnia żadnego wyliczenia, podczas gdy Hashtable zapewnia niezawodne wyliczenie.
Deklaracja:
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable>
Parametry typu:
- K – rodzaj kluczy obsługiwanych przez tę mapę
- W – rodzaj mapowanych wartości
Hierarchia Hashtable

Implementacje Hashtable Możliwość serializacji , Możliwość klonowania , Mapa interfejsy i rozszerza Słownik . Bezpośrednie podklasy to Properties , UIDdomyślne .
Konstruktorzy:
Aby utworzyć Hashtable, musimy go zaimportować z java.util.Hashtable . Istnieje wiele sposobów tworzenia Hashtable.
1. Hashtable(): Tworzy to pustą tablicę skrótów z domyślnym współczynnikiem obciążenia 0,75 i początkową pojemnością 11.
Hashtable ht = nowy Hashtable();
Jawa
// 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);> >}> }> |
>
>Wyjście
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}> 2. Hashtable(int początkowa pojemność): Spowoduje to utworzenie tabeli skrótów o rozmiarze początkowym określonym przez wartość inicjalnąCapacity, a domyślny współczynnik obciążenia wynosi 0,75.
Hashtable ht = nowy Hashtable(int początkowyCapacity);
Jawa
// 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);> >}> }> |
>
>Wyjście
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {4=four, 6=six, 5=five}> 3. Hashtable (rozmiar int, współczynnik wypełnienia zmiennoprzecinkowego): Ta wersja tworzy tabelę skrótów, której początkowy rozmiar jest określony przez rozmiar i współczynnik wypełnienia określony przez fillRatio. współczynnik wypełnienia: Zasadniczo określa, jak pełna może być tabela mieszająca, zanim zostanie zmieniona w górę, a jej wartość mieści się w przedziale od 0,0 do 1,0.
Hashtable ht = nowy Hashtable (rozmiar int, współczynnik wypełnienia zmiennoprzecinkowego);
Jawa
// 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);> >}> }> |
>
>Wyjście
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}> 4. Hashtable (mapa m): Tworzy to tablicę mieszającą, która jest inicjowana elementami w m.
Hashtable ht = nowy Hashtable (mapa m);
Jawa
// 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);> >}> }> |
>
>Wyjście
Mappings of ht2 : {3=three, 2=two, 1=one}> Przykład:
Jawa
// 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);> >}> >}> }> |
>
>Wyjście
Size of map is:- 3 {vaibhav=20, vishal=10, sachin=30} value for key 'vishal' is:- 10> Wykonywanie różnych operacji na Hashtable
1. Dodawanie elementów: Aby dodać element do tablicy mieszającej, możemy skorzystać z metody put(). Jednak kolejność wstawiania nie jest zachowywana w tablicy mieszającej. Wewnętrznie dla każdego elementu generowany jest oddzielny skrót, a elementy są indeksowane na podstawie tego skrótu, aby zwiększyć wydajność.
Jawa
// 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);> >}> }> |
>
>Wyjście
Mappings of ht1 : {3=Geeks, 2=For, 1=Geeks} Mappings of ht2 : {3=Geeks, 2=For, 1=Geeks}> 2. Zmiana elementów: Jeżeli po dodaniu elementów chcemy zmienić element, można to zrobić poprzez ponowne dodanie elementu metodą put(). Ponieważ elementy tablicy mieszającej są indeksowane za pomocą kluczy, wartość klucza można zmienić, po prostu wstawiając zaktualizowaną wartość klucza, dla którego chcemy zmienić.
Jawa
// 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);> >}> }> |
>
>Wyjście
Initial Map {3=Geeks, 2=Geeks, 1=Geeks} Updated Map {3=Geeks, 2=For, 1=Geeks}> 3. Usuwanie elementu: Aby usunąć element z Mapy możemy skorzystać z metody usuwania(). Ta metoda pobiera wartość klucza i usuwa mapowanie klucza z tej mapy, jeśli jest on obecny na mapie.
Jawa
// 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);> >}> }> |
>
>Wyjście
Initial map : {4=For, 3=Geeks, 2=For, 1=Geeks} Updated map : {3=Geeks, 2=For, 1=Geeks}> 4. Przechodzenie przez tablicę mieszającą: Aby iterować tabelę, możemy skorzystać z metody zaawansowana pętla for . Poniżej znajduje się przykład iteracji tablicy mieszającej.
Jawa
// 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());> >}> }> |
drzewo binarne Java
>
>Wyjście
vaibhav 20 vishal 10 sachin 30>
Wewnętrzne działanie Hashtable
Struktura danych Hashtable to tablica segmentów, w których przechowywane są pary klucz/wartość. Korzysta metoda hashCode(). aby określić, który segment ma być mapowany przez parę klucz/wartość.
Funkcja skrótu pomaga określić lokalizację danego klucza na liście wiader. Ogólnie rzecz biorąc, hashcode jest nieujemną liczbą całkowitą, która jest równa dla równych obiektów i może być równa lub nie dla nierównych obiektów. Aby określić, czy dwa obiekty są równe, czy nie, hashtable korzysta z metody równości().
Możliwe jest, że dwa różne obiekty mają ten sam kod skrótu. Nazywa się to kolizja . Aby rozwiązać kolizje, hashtable używa tablicy list. Pary mapowane do pojedynczego segmentu (indeks tablicy) są przechowywane na liście, a odniesienia do list są przechowywane w indeksie tablicy.

Metody Hashtable
- K – Rodzaj klawiszy na mapie.
- W – Rodzaj wartości odwzorowanych na mapie.
| METODA | OPIS |
|---|---|
| jasne() | Czyści tę tablicę mieszającą, tak aby nie zawierała kluczy. |
| klon() | Tworzy płytką kopię tej tablicy mieszającej. |
| compute (klawisz K, BiFunction K.? super V,? rozszerza funkcję V> remapping) | Próbuje obliczyć mapowanie dla określonego klucza i jego aktualnie mapowanej wartości (lub null, jeśli nie ma bieżącego mapowania). |
| computeIfAbsent (klawisz K, funkcja rozszerza funkcję V> mapping) | Jeśli określony klucz nie jest już powiązany z wartością (lub jest zmapowany na wartość null), próbuje obliczyć jego wartość za pomocą danej funkcji mapującej i wprowadza ją do tego odwzorowania, chyba że ma wartość null. |
| computeIfPresent(klawisz K, funkcja remapowania BiFunction) | Jeśli wartość określonego klucza jest obecna i nie jest null, próbuje obliczyć nowe mapowanie, biorąc pod uwagę klucz i jego aktualnie odwzorowaną wartość. |
| zawiera (wartość obiektu) | Testuje, czy jakiś klucz jest mapowany na określoną wartość w tej tablicy mieszającej. |
| zawieraKey (klucz obiektu) | Testuje, czy określony obiekt jest kluczem w tej tablicy mieszającej. |
| zawieraWartość (wartość obiektu) | Zwraca wartość true, jeśli ta tablica mieszająca odwzorowuje jeden lub więcej kluczy na tę wartość. |
| elementy() | Zwraca wyliczenie wartości w tej tablicy skrótów. |
| zestaw wpisów() | Zwraca widok zestawu mapowań zawartych na tej mapie. |
| równa się (obiekt o) | Porównuje określony obiekt z tą mapą pod kątem równości, zgodnie z definicją w interfejsie mapy. |
| pobierz (klucz obiektu) | Zwraca wartość, na którą jest mapowany określony klucz, lub null, jeśli ta mapa nie zawiera mapowania dla klucza. |
| hashCode() | Zwraca wartość kodu skrótu dla tej mapy zgodnie z definicją w interfejsie mapy. |
| jest pusty() | Testuje, czy ta tablica mieszająca nie mapuje żadnych kluczy na wartości. |
| Klucze() | Zwraca wyliczenie kluczy w tej tablicy skrótów. |
| zestaw kluczy() | Zwraca widok zestawu kluczy zawartych na tej mapie. |
| merge (klawisz K, wartość V, funkcja remapowania BiFunction) | Jeśli określony klucz nie jest już powiązany z wartością lub jest powiązany z wartością null, kojarzy go z podaną wartością inną niż null. |
| put (klawisz K, wartość V) | Mapuje określony klucz na określoną wartość w tej tablicy skrótów. |
| putAll(Mapa t) | Kopiuje wszystkie mapowania z określonej mapy do tej tablicy mieszającej. |
| powtórz() | Zwiększa pojemność i wewnętrznie reorganizuje tę tablicę mieszającą, aby efektywniej pomieścić i uzyskać dostęp do jej wpisów. |
| usuń (klucz obiektu) | Usuwa klucz (i odpowiadającą mu wartość) z tej tablicy skrótów. |
| rozmiar() | Zwraca liczbę kluczy w tej tablicy mieszającej. |
| doString() | Zwraca ciąg reprezentujący ten obiekt Hashtable w postaci zestawu wpisów ujętych w nawiasy klamrowe i oddzielonych znakami ASCII (przecinek i spacja). |
| wartości() | Zwraca widok kolekcji wartości zawartych na tej mapie. |
Metody zadeklarowane w interfejsie java.util.Map
| METODA | OPIS |
|---|---|
| forEach (akcja BiConsumer) | Wykonuje daną akcję dla każdego wpisu na tej mapie, dopóki wszystkie wpisy nie zostaną przetworzone lub akcja nie zgłosi wyjątku. |
| getOrDefault (klucz obiektu, wartość domyślna V) | Zwraca wartość, na którą jest mapowany określony klucz, lub wartość domyślną, jeśli ta mapa nie zawiera mapowania klucza. |
| putIfAbsent(klawisz K, wartość V) | Jeśli określony klucz nie jest już powiązany z wartością (lub jest odwzorowany na wartość null), kojarzy go z podaną wartością i zwraca wartość null, w przeciwnym razie zwraca bieżącą wartość. |
| usuń(klucz obiektu, Wartość obiektu) | Usuwa wpis dla określonego klucza tylko wtedy, gdy jest on aktualnie odwzorowany na określoną wartość. |
| zamień (klawisz K, wartość V) | Zastępuje wpis dla określonego klucza tylko wtedy, gdy jest on aktualnie odwzorowany na jakąś wartość. |
| zamień (klawisz K, V stara wartość, V nowa wartość) | Zastępuje wpis dla określonego klucza tylko wtedy, gdy jest aktualnie zamapowany na określoną wartość. |
| zamień wszystko (funkcja BiFunction) | Zastępuje wartość każdego wpisu wynikiem wywołania danej funkcji na tym wpisie, dopóki wszystkie wpisy nie zostaną przetworzone lub funkcja nie zgłosi wyjątku. |
Musisz przeczytać:
- Różnice między HashMap i HashTable w Javie
Zalety Hashtable:
- Bezpieczna dla wątków: Klasa Hashtable jest bezpieczna dla wątków, co oznacza, że wiele wątków może uzyskać do niej dostęp jednocześnie, nie powodując uszkodzenia danych ani innych problemów z synchronizacją.
- Prosta w użyciu: Klasa Hashtable jest prosta w użyciu i zapewnia podstawową funkcjonalność struktury danych klucz-wartość, która może być przydatna w prostych przypadkach.
Wady Hashtable:
- Przestarzała: Klasa Hashtable jest uważana za przestarzałą i ogólnie odradza się jej używanie. Dzieje się tak dlatego, że został on zaprojektowany przed wprowadzeniem frameworka Collections i nie implementuje interfejsu Map, co utrudnia jego użycie w połączeniu z innymi częściami frameworka.
- Ograniczona funkcjonalność: Klasa Hashtable zapewnia podstawową funkcjonalność struktury danych klucz-wartość, ale nie zapewnia pełnego zakresu funkcjonalności dostępnego w interfejsie Map i jego implementacjach.
- Niska wydajność: Klasa Hashtable jest zsynchronizowana, co może skutkować mniejszą wydajnością w porównaniu z innymi implementacjami interfejsu Map, takimi jak HashMap lub ConcurrentHashMap.
Leksykony:
- Kolekcje Java autorstwa Maurice'a Naftalina i Philipa Wadlera. Ta książka zawiera kompleksowy przegląd frameworku Java Collections, w tym klasy Hashtable.
- Java w pigułce Davida Flanagana. Książka ta zawiera krótkie omówienie podstawowych funkcji języka Java, w tym klasy Hashtable.
- Generics and Collections w języku Java autorstwa Maurice'a Naftalina i Philipa Wadlera. Ta książka zawiera obszerny przewodnik po generykach i kolekcjach w Javie, w tym po klasie Hashtable.
Odniesienie: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html