logo

Hashtable v Javě

The Hashtable class implementuje hashovací tabulku, která mapuje klíče na hodnoty. Libovolný nenull objekt lze použít jako klíč nebo jako hodnotu. Pro úspěšné ukládání a načítání objektů z hashtable musí objekty použité jako klíče implementovat metodu hashCode a metodu rovná se.

Třída java.util.Hashtable je třída v Javě, která poskytuje datovou strukturu klíč-hodnota, podobnou rozhraní Map. Byl součástí původního rámce Java Collections a byl představen v Javě 1.0.



Třída Hashtable je však od té doby považována za zastaralou a její používání se obecně nedoporučuje. Je to proto, že byl navržen před zavedením frameworku Collections a neimplementuje rozhraní Map, což ztěžuje použití ve spojení s jinými částmi frameworku. Třída Hashtable je navíc synchronizována, což může mít za následek pomalejší výkon ve srovnání s jinými implementacemi rozhraní Map.

Obecně se místo třídy Hashtable doporučuje používat rozhraní Map nebo některou z jeho implementací (jako je HashMap nebo ConcurrentHashMap).

Zde je příklad, jak používat třídu Hashtable:

Jáva








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));> >}> >}> }>

>

>

Výstup

Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>

Závěrem lze říci, že i když třída Hashtable v Javě stále existuje a lze ji stále používat, obecně se doporučuje místo ní používat rozhraní Map nebo některou z jeho implementací.

Vlastnosti Hashtable

  • Je podobný HashMap, ale je synchronizovaný.
  • Hashtable ukládá pár klíč/hodnota do hashovací tabulky.
  • V Hashtable zadáme objekt, který se používá jako klíč, a hodnotu, kterou chceme k tomuto klíči přiřadit. Klíč je poté hashován a výsledný hash kód je použit jako index, pod kterým je hodnota uložena v tabulce.
  • Počáteční výchozí kapacita třídy Hashtable je 11, zatímco loadFactor je 0,75.
  • HashMap neposkytuje žádný výčet, zatímco Hashtable poskytuje výčet, který není rychlý při selhání.

Prohlášení:

public class Hashtable extends Dictionary implements Map, Cloneable, Serializable>

Parametry typu:

  • K – typ klíčů spravovaných touto mapou
  • V – typ mapovaných hodnot

Hierarchie Hashtable

Hierarchie Hashtable

Hashtable nástroje Serializovatelné , Klonovatelné , Mapa rozhraní a rozšiřuje Slovník . Přímé podtřídy jsou Properties , UIDefaults .

Konstruktéři:

Abychom vytvořili hashtable, musíme jej importovat java.util.Hashtable . Hashtable můžeme vytvořit různými způsoby.

1. Hashtable(): Tím se vytvoří prázdná hashovací tabulka s výchozím faktorem zatížení 0,75 a počáteční kapacitou je 11.

Hashtable ht = new Hashtable();

Jáva




// 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);> >}> }>

>

>

Výstup

Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}>

2. Hashtable (int initialCapacity): Tím se vytvoří hashovací tabulka, která má počáteční velikost určenou parametrem initialCapacity a výchozí faktor zatížení je 0,75.

Hashtable ht = new Hashtable(int initialCapacity);

Jáva




// 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);> >}> }>

odstranit mezipaměť npm

>

>

Výstup

Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {4=four, 6=six, 5=five}>

3. Hashtable(int size, float fillRatio): Tato verze vytvoří hashovací tabulku, která má počáteční velikost určenou velikostí a poměrem plnění určeným pomocí fillRatio. fill ratio: V zásadě určuje, jak plná může být hašovací tabulka, než se její velikost změní směrem nahoru a její hodnota leží mezi 0,0 až 1,0.

Hashtable ht = new Hashtable(int size, float fillRatio);

Jáva




// 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);> >}> }>

>

>

Výstup

Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}>

4. Hashtable (Mapa m): Tím se vytvoří hashovací tabulka, která je inicializována prvky v m.

Hashtable ht = new Hashtable(Map m);

Jáva




// 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);> >}> }>

>

>

Výstup

Mappings of ht2 : {3=three, 2=two, 1=one}>

Příklad:

Jáva




// 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);> >}> >}> }>

>

>

Výstup

Size of map is:- 3 {vaibhav=20, vishal=10, sachin=30} value for key 'vishal' is:- 10>

Provádění různých operací na Hashtable

1. Přidání prvků: K přidání prvku do hashtable můžeme použít metodu put(). Objednávka vložení však není v hashovací tabulce zachována. Interně je pro každý prvek vygenerován samostatný hash a prvky jsou indexovány na základě tohoto hashu, aby byl efektivnější.

Jáva




// 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);> >}> }>

>

>

Výstup

Mappings of ht1 : {3=Geeks, 2=For, 1=Geeks} Mappings of ht2 : {3=Geeks, 2=For, 1=Geeks}>

2. Změna prvků: Po přidání prvků, pokud chceme prvek změnit, to lze provést opětovným přidáním prvku pomocí metody put(). Vzhledem k tomu, že prvky v hashovací tabulce jsou indexovány pomocí klíčů, hodnotu klíče lze změnit jednoduchým vložením aktualizované hodnoty klíče, který chceme změnit.

Jáva




// 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);> >}> }>

>

>

Výstup

Initial Map {3=Geeks, 2=Geeks, 1=Geeks} Updated Map {3=Geeks, 2=For, 1=Geeks}>

3. Odebrání prvku: K odstranění prvku z mapy můžeme použít metodu remove(). Tato metoda převezme hodnotu klíče a odstraní mapování pro klíč z této mapy, pokud je v mapě přítomen.

Jáva




// 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);> >}> }>

>

>

Výstup

Initial map : {4=For, 3=Geeks, 2=For, 1=Geeks} Updated map : {3=Geeks, 2=For, 1=Geeks}>

4. Procházení hashtable: Pro iteraci tabulky můžeme použít pokročilé pro smyčku . Níže je uveden příklad iterace hashtable.

Jáva




// 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());> >}> }>

>

>

Výstup

vaibhav 20 vishal 10 sachin 30>

Interní fungování Hashtable

Hashtable datová struktura je pole segmentů, které v nich ukládají páry klíč/hodnota. To využívá metoda hashCode(). určit, který segment by měl pár klíč/hodnota mapovat.
Hashovací funkce pomáhá určit umístění daného klíče v bucket listu. Obecně je hashcode nezáporné celé číslo, které je stejné pro stejné objekty a může nebo nemusí být stejné pro nestejné objekty. K určení, zda jsou dva objekty stejné nebo ne, používá hashtable metodu equals().

Je možné, že dva nestejné objekty mají stejný hashcode. Toto se nazývá a kolize . K vyřešení kolizí používá hashtable pole seznamů. Páry mapované do jednoho segmentu (index pole) jsou uloženy v seznamu a odkaz na seznam je uložen v indexu pole.

Srážka hashtable

Metody hashtable

  • K – Typ kláves na mapě.
  • V – Typ hodnot mapovaných v mapě.

METODA

POPIS

Průhledná() Vymaže tuto hashovací tabulku, aby neobsahovala žádné klíče.
klon() Vytvoří mělkou kopii této hashovací tabulky.

compute (klíč K, BiFunction

K,? super V,? rozšiřuje V> remappingFunction)

Pokusí se vypočítat mapování pro zadaný klíč a jeho aktuální mapovanou hodnotu (nebo null, pokud neexistuje žádné aktuální mapování).

computeIfAbsent(klávesa K, funkce

rozšiřuje V> mappingFunction)

Pokud zadaný klíč ještě není přidružen k hodnotě (nebo je mapován na hodnotu null), pokusí se vypočítat jeho hodnotu pomocí dané mapovací funkce a vloží ji do této mapy, pokud není null.
computeIfPresent (klávesa K, přemapování funkce BiFunction) Pokud je hodnota pro zadaný klíč přítomna a není nulová, pokusí se vypočítat nové mapování dané klíčem a jeho aktuální mapovanou hodnotou.
obsahuje (hodnota objektu) Testuje, zda se některý klíč mapuje na zadanou hodnotu v této hashovací tabulce.
obsahuje klíč (objektový klíč) Testuje, zda je zadaný objekt klíčem v této hashovací tabulce.
obsahujeValue(hodnota objektu) Vrátí hodnotu true, pokud tato hashovací tabulka mapuje jeden nebo více klíčů na tuto hodnotu.
Prvky() Vrátí výčet hodnot v této hashovací tabulce.
entrySet() Vrátí nastavení zobrazení mapování obsažených v této mapě.
rovná se (objekt o) Porovná zadaný objekt s touto mapou pro dosažení rovnosti podle definice v rozhraní mapy.
get (klíč objektu) Vrátí hodnotu, na kterou je zadaný klíč mapován, nebo hodnotu null, pokud tato mapa neobsahuje žádné mapování pro klíč.
hashCode() Vrátí hodnotu hash kódu pro tuto mapu podle definice v rozhraní mapy.
je prázdný() Testuje, zda tato hashovací tabulka nemapuje žádné klíče k hodnotám.
klíče() Vrátí výčet klíčů v této hashovací tabulce.
keySet() Vrátí zobrazení sady klíčů obsažených v této mapě.
sloučení (klíč K, hodnota V, přemapování funkce BiFunction) Pokud zadaný klíč ještě není přidružen k hodnotě nebo je přidružen k hodnotě null, přidruží jej k dané jiné hodnotě.
put (klíč K, hodnota V) Mapuje zadaný klíč na zadanou hodnotu v této hashovací tabulce.
putAll(mapa t) Zkopíruje všechna mapování ze zadané mapy do této hashovací tabulky.
opakovat () Zvyšuje kapacitu této hashovací tabulky a interně ji reorganizuje, aby bylo možné efektivněji pojmout její položky a přistupovat k nim.
odstranit​ (klíč objektu) Odebere klíč (a jeho odpovídající hodnotu) z této hashovací tabulky.
velikost() Vrátí počet klíčů v této hashovací tabulce.
toString() Vrátí řetězcovou reprezentaci tohoto hashtable objektu ve formě sady položek uzavřených ve složených závorkách a oddělených znaky ASCII (čárka a mezera).
hodnoty() Vrátí pohled kolekce hodnot obsažených v této mapě.

Metody deklarované v rozhraní java.util.Map

METODA

síť a internet

POPIS

pro každého (akce BiConsumer) Provede danou akci pro každý záznam v této mapě, dokud nebudou zpracovány všechny záznamy nebo akce vyvolá výjimku.
getOrDefault (klíč objektu, V defaultValue) Vrátí hodnotu, na kterou je zadaný klíč mapován, nebo defaultValue, pokud tato mapa neobsahuje žádné mapování pro klíč.
putIfAbsent​(klíč K, hodnota V) Pokud zadaný klíč ještě není přidružen k hodnotě (nebo je namapován na hodnotu null), přidruží jej k dané hodnotě a vrátí hodnotu null, jinak vrátí aktuální hodnotu.

odstranit (klíč objektu,

Hodnota objektu)

Odebere položku pro zadaný klíč pouze v případě, že je aktuálně namapován na zadanou hodnotu.
nahradit (klíč K, hodnota V) Nahradí položku pro zadaný klíč pouze v případě, že je aktuálně namapován na nějakou hodnotu.
nahradit (klíč K, V stará hodnota, V nová hodnota) Nahradí položku pro zadaný klíč, pouze pokud je aktuálně namapován na zadanou hodnotu.
nahradit vše (funkce BiFunction) Nahradí hodnotu každé položky výsledkem vyvolání dané funkce u této položky, dokud nebudou zpracovány všechny položky nebo funkce vyvolá výjimku.

Musíš číst:

  • Rozdíly mezi HashMap a HashTable v Javě

Výhody Hashtable:

  1. Thread-safe: Třída Hashtable je vlákno-safe, což znamená, že k ní může přistupovat více vláken současně, aniž by došlo k poškození dat nebo jiným problémům se synchronizací.
  2. Jednoduché použití: Třída Hashtable se snadno používá a poskytuje základní funkce datové struktury klíč-hodnota, což může být užitečné v jednoduchých případech.

Nevýhody Hashtable:

  1. Zastaralá: Třída Hashtable je považována za zastaralou a její používání se obecně nedoporučuje. Je to proto, že byl navržen před zavedením frameworku Collections a neimplementuje rozhraní Map, což ztěžuje použití ve spojení s jinými částmi frameworku.
  2. Omezená funkčnost: Třída Hashtable poskytuje základní funkce datové struktury klíč–hodnota, ale neposkytuje celou škálu funkcí, které jsou k dispozici v rozhraní Map a jeho implementacích.
  3. Špatný výkon: Třída Hashtable je synchronizovaná, což může mít za následek pomalejší výkon ve srovnání s jinými implementacemi rozhraní Map, jako je HashMap nebo ConcurrentHashMap.

Referenční knihy:

  1. Java Collections od Maurice Naftalina a Philipa Wadlera. Tato kniha poskytuje komplexní přehled o frameworku Java Collections, včetně třídy Hashtable.
  2. Java v kostce od Davida Flanagana. Tato kniha poskytuje rychlý odkaz na základní funkce Javy, včetně třídy Hashtable.
  3. Java Generics and Collections od Maurice Naftalina a Philipa Wadlera. Tato kniha poskytuje komplexního průvodce generikami a kolekcemi v Javě, včetně třídy Hashtable.

Odkaz: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html