logo

Hashtable Java

The Hashtable klasė įgyvendina maišos lentelę, kuri susieja raktus su reikšmėmis. Bet koks nenulinis objektas gali būti naudojamas kaip raktas arba kaip reikšmė. Norint sėkmingai saugoti ir gauti objektus iš maišos lentelės, objektai, naudojami kaip raktai, turi įdiegti maišos kodo ir lygybės metodus.

Klasė java.util.Hashtable yra „Java“ klasė, kuri suteikia raktų-reikšmių duomenų struktūrą, panašią į žemėlapio sąsają. Tai buvo originalios „Java Collections“ sistemos dalis ir buvo pristatyta „Java 1.0“.



Tačiau nuo to laiko „Hashtable“ klasė buvo laikoma pasenusia ir jos naudoti apskritai nerekomenduojama. Taip yra todėl, kad jis buvo sukurtas prieš įvedant rinkinių sistemą ir neįgyvendina žemėlapio sąsajos, todėl ją sunku naudoti kartu su kitomis sistemos dalimis. Be to, Hashtable klasė yra sinchronizuojama, todėl našumas gali būti lėtesnis, palyginti su kitais žemėlapio sąsajos diegimais.

Apskritai, vietoj Hashtable klasės rekomenduojama naudoti žemėlapio sąsają arba vieną iš jos įdiegimų (pvz., HashMap arba ConcurrentHashMap).

Štai pavyzdys, kaip naudoti klasę 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));> >}> >}> }>

>

>

Išvestis

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

Apibendrinant, nors „Hashtable“ klasė vis dar egzistuoja „Java“ ir vis dar gali būti naudojama, paprastai rekomenduojama vietoj jos naudoti žemėlapio sąsają arba vieną iš jos įgyvendinimų.

Hashtable savybės

  • Jis panašus į HashMap, bet yra sinchronizuotas.
  • Hashtable saugo raktų/reikšmių porą maišos lentelėje.
  • Hashtable nurodome objektą, kuris naudojamas kaip raktas, ir reikšmę, kurią norime susieti su tuo raktu. Tada raktas yra maišomas, o gautas maišos kodas naudojamas kaip indeksas, kuriame vertė saugoma lentelėje.
  • Pradinė numatytoji Hashtable klasės talpa yra 11, o „loadFactor“ yra 0,75.
  • „HashMap“ nepateikia jokio sąrašo, o „Hashtable“ pateikia negreitą išvardijimą.

Deklaracija:

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

Tipo parametrai:

  • K – šiame žemėlapyje saugomų raktų tipas
  • IN – susietų verčių tipas

Hashtable hierarchija

Hashtable hierarchija

Hashtable įrankiai Serializuojama , Galima klonuoti , Žemėlapis sąsajas ir išplečia Žodynas . Tiesioginiai poklasiai yra savybės, UIDnumatytieji nustatymai .

Konstruktoriai:

Norėdami sukurti „Hashtable“, turime jį importuoti iš java.util.Hashtable . Yra įvairių būdų, kaip sukurti „Hashtable“.

1. Hashtable (): Taip sukuriama tuščia maišos lentelė, kurios numatytasis apkrovos koeficientas yra 0,75, o pradinė talpa yra 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);> >}> }>

>

>

Išvestis

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

2. Maišos lentelė (tarp pradinė talpa): Taip sukuriama maišos lentelė, kurios pradinis dydis nurodytas inicialiniame pajėgume, o numatytasis apkrovos koeficientas yra 0,75.

Hashtable ht = new Maišos lentelė(int pradinė talpa);

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

>

>

Išvestis

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

3. Hashtable (vidinis dydis, plūduriuojančio užpildymo santykis): Ši versija sukuria maišos lentelę, kurios pradinis dydis nurodytas pagal dydį ir užpildymo koeficientą, nurodytą užpildymo santykiu. užpildymo koeficientas: iš esmės jis nustato, kiek pilna maišos lentelės gali būti prieš padidinant jos dydį, o jos reikšmė yra nuo 0,0 iki 1,0.

Maišos lentelė ht = naujas maišos lentelė (int dydis, plūduriuojančio užpildymo santykis);

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

>

c formatuotą eilutę
>

Išvestis

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

4. Hashtable (žemėlapis m): Taip sukuriama maišos lentelė, kuri inicijuojama su elementais m.

Maišos lentelė ht = nauja maišos lentelė (žemėlapis 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);> >}> }>

>

>

Išvestis

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

Pavyzdys:

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

>

>

Išvestis

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

Įvairių operacijų atlikimas su Hashtable

1. Elementų pridėjimas: Norėdami pridėti elementą prie maišos lentelės, galime naudoti put() metodą. Tačiau įterpimo tvarka maišos lentelėje neišsaugoma. Viduje kiekvienam elementui sukuriama atskira maiša ir elementai indeksuojami pagal šią maišą, kad ji būtų efektyvesnė.

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

>

>

Išvestis

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

2. Keičiami elementai: Pridėjus elementus, jei norime elementą pakeisti, tai galima padaryti dar kartą pridedant elementą put() metodu. Kadangi maišos lentelės elementai yra indeksuojami naudojant raktus, rakto reikšmę galima pakeisti tiesiog įterpiant atnaujintą rakto, kurį norime pakeisti, reikšmę.

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

>

>

Išvestis

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

3. Elemento pašalinimas: Norėdami pašalinti elementą iš žemėlapio, galime naudoti pašalinimo () metodą. Šis metodas paima rakto reikšmę ir pašalina rakto susiejimą iš šio žemėlapio, jei jis yra žemėlapyje.

Java




dvejetainė paieškos python

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

>

>

Išvestis

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

4. Hashtable peržiūra: Norėdami pakartoti lentelę, galime naudoti an išplėstinis ciklas . Žemiau pateikiamas maišos lentelės kartojimo pavyzdys.

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

>

>

Išvestis

vaibhav 20 vishal 10 sachin 30>

„Hashtable“ vidinis darbas

Maišos duomenų struktūra – tai segmentų masyvas, kuriame saugomos rakto/reikšmių poros. Jis naudojasi HashCode() metodas kad nustatytumėte, kurį segmentą turi susieti rakto/reikšmės pora.
Maišos funkcija padeda nustatyti tam tikro rakto vietą segmentų sąraše. Paprastai maišos kodas yra neneigiamas sveikasis skaičius, kuris yra lygus vienodiems objektams ir gali būti arba nelygus nelygiems objektams. Norėdami nustatyti, ar du objektai yra lygūs, ar ne, hashtable naudoja equals() metodą.

Gali būti, kad du nelygūs objektai turi tą patį maišos kodą. Tai vadinama a susidūrimas . Norėdami išspręsti susidūrimus, hashtable naudoja daugybę sąrašų. Poros, susietos su vienu segmentu (masyvo indeksas), saugomos sąraše, o sąrašo nuoroda saugoma masyvo indekse.

Hashtable susidūrimas

Hashtable metodai

  • K – klavišų tipas žemėlapyje.
  • IN – Žemėlapyje susietų verčių tipas.

METODAS

APIBŪDINIMAS

aišku () Išvalo šią maišos lentelę, kad joje nebūtų raktų.
klonas () Sukuriama sekli šios maišos lentelės kopija.

compute (K klavišas, BiFunction

K,? super V,? išplečia V> remappingFunction)

Bandoma apskaičiuoti nurodyto rakto ir jo dabartinės susietos vertės susiejimą (arba nulinę, jei dabartinio susiejimo nėra).

computeIfAbsent(K klavišas, funkcija

išplečia V> atvaizdavimo funkciją)

Jei nurodytas raktas dar nesusietas su reikšme (arba susietas su nuliu), bando apskaičiuoti jo vertę naudodamas nurodytą susiejimo funkciją ir įveda jį į šį žemėlapį, nebent nulis.
computeIfPresent (K klavišas, BiFunction remappingFunction) Jei nurodyto rakto reikšmė yra ir nėra nulinė, bandoma apskaičiuoti naują susiejimą, atsižvelgiant į raktą ir jo dabartinę susietą reikšmę.
yra(objekto reikšmė) Tikrinama, ar kai kurie raktai atitinka nurodytą reikšmę šioje maišos lentelėje.
includeKey (objekto raktas) Tikrina, ar nurodytas objektas yra šios maišos lentelės raktas.
includeValue (objekto vertė) Grąžina true, jei ši lentelė susieja vieną ar daugiau raktų su šia verte.
elementai () Pateikia verčių sąrašą šioje maišos lentelėje.
įrašasSet() Grąžina šiame žemėlapyje esančių atvaizdų rinkinio rodinį.
lygus (O objektas) Lygina nurodytą objektą su šiuo žemėlapiu, kad būtų lygybė, kaip nurodyta žemėlapio sąsajoje.
gauti (objekto raktas) Grąžina reikšmę, su kuria susietas nurodytas raktas, arba nulinę vertę, jei šiame žemėlapyje nėra rakto susiejimo.
maišos kodas () Grąžina šio žemėlapio maišos kodo reikšmę, kaip nurodyta žemėlapio sąsajoje.
Yra tuščias() Tikrina, ar šioje maišos lentelėje nėra raktų į reikšmes.
raktai() Grąžina šios maišos lentelės raktų sąrašą.
keySet() Grąžina šiame žemėlapyje esančių raktų rinkinio rodinį.
sulieti (K raktas, V reikšmė, BiFunction remappingFunction) Jei nurodytas raktas dar nesusietas su reikšme arba yra susietas su nuliu, susieja jį su nurodyta nenuline verte.
įdėti (K klavišas, V reikšmė) Nurodytą raktą susieja su nurodyta verte šioje maišos lentelėje.
įdėti viską (žemėlapis t) Nukopijuoja visus susiejimus iš nurodyto žemėlapio į šią maišos lentelę.
rehash () Padidina šios maišos lentelės pajėgumą ir viduje pertvarko, kad būtų galima efektyviau pritaikyti ir pasiekti jos įrašus.
pašalinti (Objekto raktas) Pašalina raktą (ir atitinkamą jo reikšmę) iš šios maišos lentelės.
dydis () Grąžina raktų skaičių šioje maišos lentelėje.
toString() Pateikia šio Hashtable objekto eilutės atvaizdavimą įrašų rinkinio pavidalu, įterptų skliaustuose ir atskirtų ASCII simboliais , (kablelis ir tarpas).
reikšmės () Grąžina šiame žemėlapyje esančių verčių rinkinio rodinį.

Metodai, nurodyti sąsajoje java.util.Map

METODAS

APIBŪDINIMAS

už kiekvieną (dviejų vartotojų veiksmas) Atlieka nurodytą veiksmą kiekvienam šio žemėlapio įrašui, kol visi įrašai bus apdoroti arba veiksmas padarys išimtį.
getOrDefault (objekto raktas, V numatytoji vertė) Grąžina reikšmę, su kuria susietas nurodytas raktas, arba defaultValue, jei šiame žemėlapyje nėra rakto susiejimo.
putIfAbsent (K raktas, V reikšmė) Jei nurodytas raktas dar nesusietas su reikšme (arba susietas su nuliu), susieja jį su nurodyta reikšme ir grąžina nulį, kitu atveju grąžina dabartinę reikšmę.

pašalinti (Objekto raktas,

Objekto vertė)

Pašalina nurodyto rakto įrašą tik tuo atveju, jei jis šiuo metu susietas su nurodyta reikšme.
pakeisti (K klavišas, V reikšmė) Pakeičia nurodyto rakto įrašą tik tuo atveju, jei jis šiuo metu susietas su kokia nors verte.
pakeisti (K raktas, V senoji vertė, V nauja vertė) Pakeičia nurodyto rakto įrašą tik tuo atveju, jei šiuo metu susietas su nurodyta reikšme.
pakeisti viską (funkcija „BiFunction“) Pakeičia kiekvieno įrašo reikšmę to įrašo nurodytos funkcijos iškvietimo rezultatu, kol visi įrašai bus apdoroti arba funkcija padarys išimtį.

Privaloma perskaityti:

  • „HashMap“ ir „HashTable“ skirtumai „Java“.

„Hashtable“ pranašumai:

  1. Apsauga nuo gijų: „Hashtable“ klasė yra apsaugota nuo gijų, o tai reiškia, kad kelios gijos gali ją pasiekti vienu metu, nesukeldamos duomenų sugadinimo ar kitų sinchronizavimo problemų.
  2. Paprasta naudoti: „Hashtable“ klasę paprasta naudoti ir ji suteikia pagrindines raktinių reikšmių duomenų struktūros funkcijas, kurios gali būti naudingos paprastais atvejais.

Hashtable trūkumai:

  1. Pasenusi: „Hashtable“ klasė laikoma pasenusia ir jos naudoti apskritai nerekomenduojama. Taip yra todėl, kad jis buvo sukurtas prieš įvedant rinkinių sistemą ir neįgyvendina žemėlapio sąsajos, todėl ją sunku naudoti kartu su kitomis sistemos dalimis.
  2. Ribotas funkcionalumas: „Hashtable“ klasė suteikia pagrindines raktinių reikšmių duomenų struktūros funkcijas, tačiau nesuteikia visų funkcijų, kurios yra pasiekiamos žemėlapio sąsajoje ir jos diegimuose.
  3. Prastas našumas: „Hashtable“ klasė yra sinchronizuota, todėl našumas gali būti lėtesnis, palyginti su kitais žemėlapio sąsajos diegimais, pvz., „HashMap“ arba „ConcurrentHashMap“.

Žinynai:

  1. Maurice'o Naftalino ir Philipo Wadlerio „Java“ kolekcijos. Šioje knygoje pateikiama išsami Java kolekcijų sistemos, įskaitant Hashtable klasę, apžvalga.
  2. Java trumpai, David Flanagan. Šioje knygoje pateikiama greita informacija apie pagrindines „Java“ funkcijas, įskaitant „Hashtable“ klasę.
  3. Maurice'o Naftalino ir Philipo Wadlerio „Java Generics and Collections“. Šioje knygoje pateikiamas išsamus „Java“ generinių vaistų ir kolekcijų vadovas, įskaitant „Hashtable“ klasę.

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