logo

Hashtable v jazyku Java

The Hashtable trieda implementuje hašovaciu tabuľku, ktorá mapuje kľúče na hodnoty. Akýkoľvek nenulový objekt možno použiť ako kľúč alebo ako hodnotu. Na úspešné uloženie a načítanie objektov z hašovacej tabuľky musia objekty použité ako kľúče implementovať metódu hashCode a metódu rovná sa.

Trieda java.util.Hashtable je trieda v jazyku Java, ktorá poskytuje dátovú štruktúru kľúč-hodnota, podobnú rozhraniu Map. Bol súčasťou pôvodného rámca Java Collections a bol predstavený v jazyku Java 1.0.



Trieda Hashtable je však odvtedy považovaná za zastaranú a jej používanie sa vo všeobecnosti neodporúča. Je to preto, že bol navrhnutý pred zavedením rámca Collections a neimplementuje rozhranie mapy, čo sťažuje použitie v spojení s inými časťami rámca. Trieda Hashtable je navyše synchronizovaná, čo môže mať za následok pomalší výkon v porovnaní s inými implementáciami rozhrania Map.

Vo všeobecnosti sa odporúča namiesto triedy Hashtable použiť rozhranie Map alebo niektorú z jeho implementácií (napríklad HashMap alebo ConcurrentHashMap).

Tu je príklad použitia triedy Hashtable:

Java








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ýkon

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

Na záver, hoci trieda Hashtable stále existuje v Jave a stále sa dá použiť, vo všeobecnosti sa odporúča použiť namiesto nej rozhranie mapy alebo niektorú z jeho implementácií.

Vlastnosti Hashtable

  • Je podobná HashMap, ale je synchronizovaná.
  • Hashtable ukladá pár kľúč/hodnota do hašovacej tabuľky.
  • V Hashtable zadávame objekt, ktorý sa používa ako kľúč, a hodnotu, ktorú chceme k tomuto kľúču priradiť. Kľúč sa potom hašuje a výsledný hašovací kód sa použije ako index, v ktorom je hodnota uložená v tabuľke.
  • Počiatočná predvolená kapacita triedy Hashtable je 11, zatiaľ čo loadFactor je 0,75.
  • HashMap neposkytuje žiadne enumerácie, zatiaľ čo Hashtable poskytuje enumeráciu, ktorá nie je rýchla.

Vyhlásenie:

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

Parametre typu:

  • K – typ kľúčov udržiavaných touto mapou
  • V – typ mapovaných hodnôt

Hierarchia Hashtable

Hierarchia Hashtable

Hashtable nástroje Serializovateľné , Klonovateľné , Mapa rozhrania a rozširuje Slovník . Priame podtriedy sú Properties , UIDefaults .

Konštruktéri:

Aby sme vytvorili hashtable, musíme ho importovať z java.util.Hashtable . Hashtable môžeme vytvoriť rôznymi spôsobmi.

1. Hashtable(): Tým sa vytvorí prázdna hašovacia tabuľka s predvoleným faktorom zaťaženia 0,75 a počiatočnou kapacitou je 11.

Hashtable ht = new Hashtable();

Java




// 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ýkon

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

2. Hashtable (int initialCapacity): Tým sa vytvorí hašovacia tabuľka, ktorá má počiatočnú veľkosť špecifikovanú pomocou initialCapacity a predvolený faktor zaťaženia je 0,75.

Hashtable ht = new Hashtable(int initialCapacity);

Java




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

>

>

Výkon

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

3. Hashtable(int size, float fillRatio): Táto verzia vytvorí hašovaciu tabuľku, ktorá má počiatočnú veľkosť určenú veľkosťou a pomerom výplne určenou parametrom fillRatio. pomer plnenia: V podstate určuje, ako plná môže byť hašovacia tabuľka predtým, ako sa jej veľkosť zmení nahor, a jej hodnota leží medzi 0,0 až 1,0.

set vs mapa

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

Java




// 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ýkon

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

4. Hashtable (Mapa m): Tým sa vytvorí hašovacia tabuľka, ktorá sa inicializuje s prvkami v m.

Hashtable ht = new Hashtable(Map m);

Java




// 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ýkon

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

Príklad:

Java




// 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ýkon

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

Vykonávanie rôznych operácií na Hashtable

1. Pridanie prvkov: Na pridanie prvku do hashtable môžeme použiť metódu put(). Objednávka vloženia sa však nezachová v hašovacej tabuľke. Interne sa pre každý prvok vygeneruje samostatný hash a prvky sa indexujú na základe tohto hashu, aby bol efektívnejší.

Java




// 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ýkon

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

2. Zmena prvkov: Po pridaní prvkov, ak chceme prvok zmeniť, môžeme to urobiť opätovným pridaním prvku pomocou metódy put(). Keďže prvky v hašovacej tabuľke sú indexované pomocou kľúčov, hodnotu kľúča je možné zmeniť jednoduchým vložením aktualizovanej hodnoty pre kľúč, ktorý chceme zmeniť.

Java




// 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ýkon

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

3. Odstránenie prvku: Na odstránenie prvku z mapy môžeme použiť metódu remove(). Táto metóda prevezme hodnotu kľúča a odstráni mapovanie pre kľúč z tejto mapy, ak sa na mape nachádza.

Java




// 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ýkon

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

4. Prechod hašovacej tabuľky: Na iteráciu tabuľky môžeme použiť pokročilé pre slučku . Nižšie je uvedený príklad iterácie hashtable.

Java




// 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ýkon

vaibhav 20 vishal 10 sachin 30>

Interné fungovanie Hashtable

Dataštruktúra hashtable je pole segmentov, ktoré v nich ukladajú páry kľúč/hodnota. Využíva sa metóda hashCode(). určiť, ktorý segment by mal pár kľúč/hodnota mapovať.
Hašovacia funkcia pomáha určiť umiestnenie daného kľúča v zozname. Vo všeobecnosti je hashcode nezáporné celé číslo, ktoré je rovnaké pre rovnaké objekty a môže alebo nemusí byť rovnaké pre nerovnaké objekty. Na určenie, či sú dva objekty rovnaké alebo nie, používa hashtable metódu equals().

Je možné, že dva nerovnaké objekty majú rovnaký hash kód. Toto sa nazýva a Zrážka . Na vyriešenie kolízií používa hashtable pole zoznamov. Páry mapované do jedného segmentu (index poľa) sú uložené v zozname a odkaz na zoznam je uložený v indexe poľa.

Zrážka hashtable

Metódy hashtable

  • K – Typ kľúčov na mape.
  • V – Typ hodnôt mapovaných na mape.

METÓDA

POPIS

jasný() Vymaže túto hašovaciu tabuľku, aby neobsahovala žiadne kľúče.
klon() Vytvorí plytkú kópiu tejto hašovacej tabuľky.

compute (kláves K, BiFunction

K,? super V,? rozširuje V> remappingFunction)

Pokúsi sa vypočítať mapovanie pre zadaný kľúč a jeho aktuálnu mapovanú hodnotu (alebo null, ak neexistuje žiadne aktuálne mapovanie).

computeIfAbsent(kláves K, funkcia

rozširuje V> mappingFunction)

Ak zadaný kľúč ešte nie je priradený k hodnote (alebo je namapovaný na hodnotu null), pokúsi sa vypočítať jeho hodnotu pomocou danej mapovacej funkcie a vloží ju do tejto mapy, pokiaľ nie je nulová.
computeIfPresent (kláves K, premapovanie funkcie BiFunction) Ak je hodnota zadaného kľúča prítomná a nie je nulová, pokúsi sa vypočítať nové mapovanie vzhľadom na kľúč a jeho aktuálnu namapovanú hodnotu.
obsahuje (hodnota objektu) Testuje, či sa niektorý kľúč mapuje na zadanú hodnotu v tejto hašovacej tabuľke.
obsahuje kľúč (kľúč objektu) Testuje, či je zadaný objekt kľúčom v tejto hašovacej tabuľke.
obsahujeValue(hodnota objektu) Vráti hodnotu true, ak táto hašovacia tabuľka mapuje jeden alebo viac kľúčov na túto hodnotu.
prvky() Vráti enumeráciu hodnôt v tejto hašovacej tabuľke.
entrySet() Vráti zobrazenie Nastaviť mapovania obsiahnuté v tejto mape.
rovná sa (Objekt o) Porovná špecifikovaný objekt s touto mapou na dosiahnutie rovnosti podľa definície v rozhraní mapy.
get (kľúč objektu) Vráti hodnotu, na ktorú je zadaný kľúč namapovaný, alebo hodnotu null, ak táto mapa neobsahuje žiadne mapovanie pre kľúč.
hashCode() Vráti hodnotu hash kódu pre túto mapu podľa definície v rozhraní mapy.
je prázdny() Testuje, či táto hašovacia tabuľka nemapuje žiadne kľúče k hodnotám.
kľúče () Vráti zoznam kľúčov v tejto hašovacej tabuľke.
keySet() Vráti zobrazenie Set kľúčov obsiahnutých v tejto mape.
zlúčenie (kľúč K, hodnota V, premapovanie funkcie BiFunction) Ak zadaný kľúč ešte nie je priradený k hodnote alebo je priradený k hodnote null, priradí ho k danej hodnote, ktorá nie je nulová.
put (kľúč K, hodnota V) Mapuje zadaný kľúč na zadanú hodnotu v tejto hašovacej tabuľke.
putAll(Mapa t) Skopíruje všetky mapovania zo zadanej mapy do tejto hašovacej tabuľky.
opakovať () Zvyšuje kapacitu a interne reorganizuje túto hašovaciu tabuľku, aby sa jej položky prispôsobili efektívnejšie.
odstrániť (kľúč objektu) Odstráni kľúč (a jeho zodpovedajúcu hodnotu) z tejto hašovacej tabuľky.
veľkosť () Vráti počet kľúčov v tejto hašovacej tabuľke.
natiahnuť() Vráti reťazcovú reprezentáciu tohto objektu Hashtable vo forme množiny položiek uzavretých v zátvorkách a oddelených znakmi ASCII (čiarka a medzera).
hodnoty() Vráti zobrazenie kolekcie hodnôt obsiahnutých v tejto mape.

Metódy deklarované v rozhraní java.util.Map

METÓDA

POPIS

pre každého (akcia pre dvoch spotrebiteľov) Vykoná danú akciu pre každý záznam na tejto mape, kým nie sú spracované všetky záznamy alebo kým akcia nevyvolá výnimku.
getOrDefault (kľúč objektu, V predvolená hodnota) Vráti hodnotu, na ktorú je zadaný kľúč namapovaný, alebo defaultValue, ak táto mapa neobsahuje žiadne mapovanie pre kľúč.
putIfAbsent​(kľúč K, hodnota V) Ak zadaný kľúč ešte nie je priradený k hodnote (alebo je namapovaný na hodnotu null), priradí ho k danej hodnote a vráti hodnotu null, inak vráti aktuálnu hodnotu.

odstrániť (kľúč objektu,

Hodnota objektu)

Odstráni položku pre zadaný kľúč len vtedy, ak je aktuálne namapovaný na zadanú hodnotu.
nahradiť (kľúč K, hodnota V) Nahradí záznam pre zadaný kľúč iba vtedy, ak je momentálne namapovaný na nejakú hodnotu.
nahradiť (kľúč K, V stará hodnota, V nová hodnota) Nahradí záznam pre zadaný kľúč len vtedy, ak je aktuálne namapovaný na zadanú hodnotu.
nahradiť všetko (funkcia BiFunction) Nahradí hodnotu každej položky výsledkom vyvolania danej funkcie na tejto položke, kým nie sú spracované všetky položky alebo funkcia nevyvolá výnimku.

Musíte prečítať:

  • Rozdiely medzi HashMap a HashTable v Jave

Výhody Hashtable:

  1. Bezpečné pre vlákna: Trieda Hashtable je bezpečná pre vlákna, čo znamená, že k nej môžu pristupovať viaceré vlákna súčasne bez toho, aby spôsobili poškodenie údajov alebo iné problémy so synchronizáciou.
  2. Jednoduché použitie: Trieda Hashtable sa jednoducho používa a poskytuje základnú funkčnosť dátovej štruktúry kľúč – hodnota, ktorá môže byť užitočná v jednoduchých prípadoch.

Nevýhody Hashtable:

  1. Zastaraná: Trieda Hashtable sa považuje za zastaranú a jej používanie sa vo všeobecnosti neodporúča. Je to preto, že bol navrhnutý pred zavedením rámca Collections a neimplementuje rozhranie mapy, čo sťažuje použitie v spojení s inými časťami rámca.
  2. Obmedzená funkčnosť: Trieda Hashtable poskytuje základnú funkčnosť dátovej štruktúry kľúč – hodnota, ale neposkytuje celú škálu funkcií, ktoré sú dostupné v rozhraní mapy a jeho implementáciách.
  3. Slabý výkon: Trieda Hashtable je synchronizovaná, čo môže mať za následok pomalší výkon v porovnaní s inými implementáciami rozhrania mapy, ako je HashMap alebo ConcurrentHashMap.

Referenčná literatúra:

  1. Java Collections od Mauricea Naftalina a Philipa Wadlera. Táto kniha poskytuje komplexný prehľad rámca Java Collections, vrátane triedy Hashtable.
  2. Java v kocke od Davida Flanagana. Táto kniha poskytuje rýchly odkaz na základné funkcie jazyka Java vrátane triedy Hashtable.
  3. Java Generics and Collections od Mauricea Naftalina a Philipa Wadlera. Táto kniha poskytuje komplexného sprievodcu generikami a zbierkami v jazyku Java, vrátane triedy Hashtable.

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