The Razpršitvena tabela implementira zgoščeno tabelo, ki preslika ključe v vrednosti. Vsak objekt, ki ni ničelni, se lahko uporabi kot ključ ali kot vrednost. Za uspešno shranjevanje in pridobivanje objektov iz zgoščevalne tabele morajo objekti, ki se uporabljajo kot ključi, implementirati metodo hashCode in metodo equals.
Razred java.util.Hashtable je razred v Javi, ki zagotavlja podatkovno strukturo ključ-vrednost, podobno vmesniku Map. Bil je del izvirnega ogrodja zbirk Java in je bil predstavljen v Javi 1.0.
Vendar je bil razred Hashtable od takrat ocenjen kot zastarel in njegova uporaba se na splošno odsvetuje. To je zato, ker je bil zasnovan pred uvedbo ogrodja Collections in ne izvaja vmesnika Map, zaradi česar je težko uporabljati v povezavi z drugimi deli ogrodja. Poleg tega je razred Hashtable sinhroniziran, kar lahko povzroči počasnejše delovanje v primerjavi z drugimi izvedbami vmesnika Map.
Na splošno je priporočljivo, da uporabite vmesnik Map ali eno od njegovih implementacij (kot sta HashMap ali ConcurrentHashMap) namesto razreda Hashtable.
Tu je primer uporabe razreda 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));> >}> >}> }> |
>
>Izhod
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>
Skratka, čeprav razred Hashtable še vedno obstaja v Javi in ga je še vedno mogoče uporabljati, je na splošno priporočljivo, da namesto tega uporabite vmesnik Map ali eno od njegovih izvedb.
Funkcije Hashtable
- Podoben je HashMapu, vendar je sinhroniziran.
- Hashtable shrani par ključ/vrednost v zgoščevalno tabelo.
- V Hashtable določimo predmet, ki se uporablja kot ključ, in vrednost, ki jo želimo povezati s tem ključem. Ključ se nato zgosti, nastala zgoščena koda pa se uporabi kot indeks, pri katerem je vrednost shranjena v tabeli.
- Začetna privzeta zmogljivost razreda Hashtable je 11, medtem ko je loadFactor 0,75.
- HashMap ne zagotavlja nobenega naštevanja, medtem ko Hashtable zagotavlja naštevanje, ki ni brezhibno.
Izjava:
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable>
Parametri tipa:
- K – vrsto ključev, ki jih vzdržuje ta zemljevid
- IN – vrsta preslikanih vrednosti
Hierarhija Hashtable

Pripomočki razpršitvene tabele Serializable , Klonirati , Zemljevid vmesniki in razširitve Slovar . Neposredni podrazredi so Lastnosti, UIDefaults .
Konstruktorji:
Da bi ustvarili Hashtable, jo moramo uvoziti iz java.util.Hashtable . Hashtable lahko ustvarimo na različne načine.
1. Zgoščena tabela (): To ustvari prazno razpršilno tabelo s privzetim faktorjem obremenitve 0,75 in začetno zmogljivostjo 11.
Hashtable ht = nova Hashtable();
Java
logično v niz 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);> >}> }> |
>
>Izhod
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}> 2. Hashtable(int initialCapacity): To ustvari zgoščeno tabelo, ki ima začetno velikost, določeno z initialCapacity, privzeti faktor obremenitve pa je 0,75.
Hashtable ht = nova 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);> >}> }> |
izberite več tabel sql
>
>Izhod
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {4=four, 6=six, 5=five}> 3. Hashtable (int size, float fillRatio): Ta različica ustvari zgoščeno tabelo, ki ima začetno velikost, določeno z velikostjo, in razmerje polnjenja, določeno s fillRatio. razmerje polnjenja: v bistvu določa, kako polna je lahko zgoščevalna tabela, preden se spremeni velikost navzgor, njena vrednost pa je med 0,0 in 1,0.
Hashtable ht = nova Hashtable(int velikost, 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);> >}> }> |
>
>Izhod
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four}> 4. Zgoščena tabela (zemljevid m): To ustvari razpršilno tabelo, ki je inicializirana z elementi v m.
Hashtable ht = nova 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);> >}> }> |
>
>Izhod
Mappings of ht2 : {3=three, 2=two, 1=one}> primer:
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);> >}> >}> }> |
>
>Izhod
Size of map is:- 3 {vaibhav=20, vishal=10, sachin=30} value for key 'vishal' is:- 10> Izvajanje različnih operacij na Hashtable
1. Dodajanje elementov: Da bi dodali element v hashtable, lahko uporabimo metodo put(). Vendar se vrstni red vstavljanja ne ohrani v zgoščevalni tabeli. Interno se za vsak element ustvari ločena zgoščena vrednost in elementi se indeksirajo na podlagi te zgoščene vrednosti, da je učinkovitejša.
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);> >}> }> |
testiranje in vrste programske opreme
>
>Izhod
Mappings of ht1 : {3=Geeks, 2=For, 1=Geeks} Mappings of ht2 : {3=Geeks, 2=For, 1=Geeks}> 2. Spreminjanje elementov: Po dodajanju elementov, če želimo element spremeniti, lahko to storimo tako, da ponovno dodamo element z metodo put(). Ker so elementi v zgoščevalni tabeli indeksirani s pomočjo ključev, lahko vrednost ključa spremenimo tako, da preprosto vstavimo posodobljeno vrednost za ključ, za katerega želimo spremeniti.
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);> >}> }> |
>
>Izhod
Initial Map {3=Geeks, 2=Geeks, 1=Geeks} Updated Map {3=Geeks, 2=For, 1=Geeks}> 3. Odstranjevanje elementa: Za odstranitev elementa iz zemljevida lahko uporabimo metodo remove(). Ta metoda prevzame vrednost ključa in odstrani preslikavo za ključ s te preslikave, če je prisotna v preslikavi.
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);> >}> }> |
>
>Izhod
Initial map : {4=For, 3=Geeks, 2=For, 1=Geeks} Updated map : {3=Geeks, 2=For, 1=Geeks}> 4. Prehod zgoščene tabele: Za ponavljanje tabele lahko uporabimo an napredna for zanka . Spodaj je primer ponovitve zgoščene tabele.
Java
spark tutorial
// 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());> >}> }> |
>
>Izhod
vaibhav 20 vishal 10 sachin 30>
Notranje delovanje Hashtable
Podatkovna struktura zgoščene tabele je niz veder, ki v njih shranjuje pare ključ/vrednost. Uporablja se metoda hashCode(). da določite, katero vedro naj preslika par ključ/vrednost.
Funkcija zgoščevanja pomaga določiti lokacijo danega ključa na seznamu segmentov. Na splošno je hashcode nenegativno celo število, ki je enako za enake predmete in je lahko ali pa tudi ne za neenake predmete. Za ugotavljanje, ali sta dva predmeta enaka ali ne, hashtable uporablja metodo equals().
Možno je, da imata dva neenaka objekta isto hashcode. To se imenuje a trk . Za razrešitev kolizij hashtable uporablja niz seznamov. Pari, preslikani v eno samo vedro (indeks matrike), so shranjeni na seznamu, sklic na seznam pa je shranjen v indeksu matrike.

Metode Hashtable
- K – Vrsta ključev na zemljevidu.
- IN – Vrsta vrednosti, preslikanih na zemljevidu.
| METODA | OPIS |
|---|---|
| počisti() | Počisti to zgoščeno tabelo, tako da ne vsebuje ključev. |
| klon() | Ustvari plitvo kopijo te zgoščene tabele. |
| izračunaj (tipka K, BiFunction K,? super V,? razširi V> remappingFunction) | Poskuša izračunati preslikavo za navedeni ključ in njegovo trenutno preslikano vrednost (ali ničelno, če ni trenutne preslikave). |
| computeIfAbsent(tipka K, funkcija razširi V> funkcijo preslikave) | Če navedeni ključ še ni povezan z vrednostjo (ali je preslikan v nič), poskuša izračunati njegovo vrednost z dano funkcijo preslikave in jo vnese v to preslikavo, razen če je nič. |
| computeIfPresent(tipka K, BiFunction remappingFunction) | Če je vrednost podanega ključa prisotna in ni ničelna, poskuša izračunati novo preslikavo glede na ključ in njegovo trenutno preslikano vrednost. |
| vsebuje (vrednost predmeta) | Preveri, ali se nekateri ključi preslikajo v navedeno vrednost v tej zgoščeni tabeli. |
| containsKey(ključ predmeta) | Preveri, ali je navedeni predmet ključ v tej zgoščevalni tabeli. |
| containsValue(vrednost predmeta) | Vrne true, če ta zgoščena tabela preslika enega ali več ključev v to vrednost. |
| elementi () | Vrne naštevanje vrednosti v tej zgoščeni tabeli. |
| vnosSet() | Vrne nastavljeni pogled preslikav, ki jih vsebuje ta zemljevid. |
| je enako (predmet o) | Primerja navedeni predmet s tem zemljevidom glede enakosti, kot je določeno v vmesniku zemljevida. |
| get (ključ predmeta) | Vrne vrednost, v katero je preslikan podani ključ, ali nič, če ta preslikava ne vsebuje preslikave za ključ. |
| hashCode() | Vrne vrednost zgoščene kode za ta zemljevid v skladu z definicijo v vmesniku zemljevida. |
| je prazno() | Preveri, ali ta zgoščena tabela ne preslika nobenih ključev v vrednosti. |
| ključi() | Vrne naštevanje ključev v tej zgoščeni tabeli. |
| keySet() | Vrne nastavljeni pogled ključev, ki jih vsebuje ta zemljevid. |
| spoji (tipka K, vrednost V, funkcija preslikave BiFunction) | Če navedeni ključ še ni povezan z vrednostjo ali je povezan z ničelno vrednostjo, ga poveže z dano vrednostjo, ki ni ničelna. |
| postavi (tipka K, vrednost V) | Preslika podani ključ v podano vrednost v tej zgoščeni tabeli. |
| dajVse(Preslikava t) | Kopira vse preslikave iz navedenega zemljevida v to zgoščeno tabelo. |
| ponovi () | Poveča zmogljivost in interno reorganizira to zgoščevalno tabelo, da lahko učinkoviteje sprejme in dostopa do njenih vnosov. |
| odstrani (predmetni ključ) | Odstrani ključ (in njegovo ustrezno vrednost) iz te zgoščene tabele. |
| velikost () | Vrne število ključev v tej zgoščeni tabeli. |
| toString() | Vrne predstavitev niza tega predmeta Hashtable v obliki niza vnosov, zaprtih v oklepajih in ločenih z znaki ASCII (vejica in presledek). |
| vrednote() | Vrne pogled zbirke vrednosti, ki jih vsebuje ta zemljevid. |
Metode, deklarirane v vmesniku java.util.Map
| METODA | OPIS |
|---|---|
| forEach(dejanje BiConsumer) | Izvede dano dejanje za vsak vnos v tem zemljevidu, dokler niso vsi vnosi obdelani ali dejanje vrže izjemo. |
| getOrDefault(ključ predmeta, V defaultValue) | Vrne vrednost, v katero je preslikan podani ključ, ali defaultValue, če ta preslikava ne vsebuje preslikave za ključ. |
| putIfAbsent (tipka K, vrednost V) | Če podani ključ še ni povezan z vrednostjo (ali je preslikan v ničelno), ga poveže z dano vrednostjo in vrne ničelno vrednost, sicer vrne trenutno vrednost. |
| odstrani (predmetni ključ, Vrednost predmeta) | Odstrani vnos za navedeni ključ le, če je trenutno preslikan v podano vrednost. |
| zamenjaj (tipka K, vrednost V) | Zamenja vnos za navedeni ključ le, če je trenutno preslikan v neko vrednost. |
| zamenjaj (tipka K, V stara vrednost, V nova vrednost) | Zamenja vnos za podani ključ le, če je trenutno preslikan v podano vrednost. |
| zamenjaj vse (funkcija BiFunction) | Zamenja vrednost vsakega vnosa z rezultatom priklica dane funkcije za ta vnos, dokler niso obdelani vsi vnosi ali funkcija vrže izjemo. |
Morati prebrati:
- Razlike med HashMap in HashTable v Javi
Prednosti Hashtable:
- Nitno varno: Razred Hashtable je nitno varen, kar pomeni, da lahko do njega dostopa več niti hkrati, ne da bi pri tem prišlo do poškodb podatkov ali drugih težav pri sinhronizaciji.
- Enostaven za uporabo: Razred Hashtable je preprost za uporabo in zagotavlja osnovno funkcionalnost podatkovne strukture ključ-vrednost, ki je lahko uporabna v preprostih primerih.
Slabosti Hashtable:
- Zastarelo: Razred Hashtable velja za zastarelega in njegova uporaba se na splošno odsvetuje. To je zato, ker je bil zasnovan pred uvedbo ogrodja Collections in ne izvaja vmesnika Map, zaradi česar je težko uporabljati v povezavi z drugimi deli ogrodja.
- Omejena funkcionalnost: Razred Hashtable zagotavlja osnovno funkcionalnost podatkovne strukture ključ-vrednost, vendar ne zagotavlja celotnega obsega funkcionalnosti, ki je na voljo v vmesniku Map in njegovih izvedbah.
- Slabo delovanje: razred Hashtable je sinhroniziran, kar lahko povzroči počasnejše delovanje v primerjavi z drugimi izvedbami vmesnika Map, kot sta HashMap ali ConcurrentHashMap.
Referenčne knjige:
- Java Collections Mauricea Naftalina in Philipa Wadlerja. Ta knjiga nudi celovit pregled ogrodja zbirk Java, vključno z razredom Hashtable.
- Java na kratko David Flanagan. V tej knjigi je hitra referenca za osnovne funkcije Jave, vključno z razredom Hashtable.
- Java Generics and Collections Mauricea Naftalina in Philipa Wadlerja. Ta knjiga ponuja obsežen vodnik po generičnih in zbirkah v Javi, vključno z razredom Hashtable.
Referenca: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html