Hashtable Javassa
The Hashtable luokka toteuttaa hash-taulukon, joka kartoittaa avaimet arvoihin. Mitä tahansa ei-null-objektia voidaan käyttää avaimena tai arvona. Objektien tallentaminen ja hakeminen hashtableista onnistuneesti edellyttää, että avaimina käytettävien objektien tulee toteuttaa hashCode- ja equals-metodi.
Luokka java.util.Hashtable on Java-luokka, joka tarjoaa avainarvotietorakenteen, joka on samanlainen kuin Map-käyttöliittymä. Se oli osa alkuperäistä Java Collections -kehystä ja otettiin käyttöön Java 1.0:ssa.
Hashtable-luokkaa on kuitenkin sittemmin pidetty vanhentuneena, ja sen käyttöä ei yleensä suositella. Tämä johtuu siitä, että se on suunniteltu ennen Collections-kehyksen käyttöönottoa, eikä se toteuta Map-käyttöliittymää, mikä vaikeuttaa sen käyttöä yhdessä muiden kehyksen osien kanssa. Lisäksi Hashtable-luokka on synkronoitu, mikä voi johtaa hitaampaan suorituskykyyn verrattuna muihin Map-käyttöliittymän toteutuksiin.
Yleensä on suositeltavaa käyttää Map-käyttöliittymää tai jotakin sen toteutuksista (kuten HashMap tai ConcurrentHashMap) Hashtable-luokan sijaan.
Tässä on esimerkki Hashtable-luokan käytöstä:
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));> > }> > }> }> |
Lähtö
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3
Yhteenvetona voidaan todeta, että vaikka Hashtable-luokka on edelleen olemassa Javassa ja sitä voidaan edelleen käyttää, on yleensä suositeltavaa käyttää sen sijaan Map-käyttöliittymää tai jotakin sen toteutuksista.
Hashtablen ominaisuudet
- Se on samanlainen kuin HashMap, mutta on synkronoitu.
- Hashtable tallentaa avain/arvo-parin hash-taulukkoon.
- Hashtableissa määritämme objektin, jota käytetään avaimena, ja arvon, jonka haluamme liittää kyseiseen avaimeen. Sitten avain tiivistetään, ja tuloksena olevaa hash-koodia käytetään indeksinä, johon arvo tallennetaan taulukkoon.
- Hashtable-luokan alkuperäinen oletuskapasiteetti on 11, kun taas loadFactor on 0,75.
- HashMap ei tarjoa luetteloa, kun taas Hashtable ei tarjoa nopeaa luettelointia.
Ilmoitus:
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable
Tyyppiparametrit:
- K – tämän kartan ylläpitämien avainten tyyppi
- SISÄÄN – kartoitettujen arvojen tyyppi
Hashtablen hierarkia
Hashtable-työkalut Sarjasoitavissa , Kloonattavissa , Kartta rajapintoja ja laajenee Sanakirja . Suorat alaluokat ovat Properties, UID-oletukset .
Rakentajat:
Hashtablen luomiseksi meidän on tuotava se kohteesta java.util.Hashtable . Hashtable voidaan luoda monella eri tavalla.
1. Hashtable(): Tämä luo tyhjän hash-taulukon, jonka oletuslatauskerroin on 0,75 ja alkukapasiteetti on 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);> > }> }> |
Lähtö
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four} 2. Hashtable (int alkuperäinen kapasiteetti): Tämä luo hajautustaulukon, jonka alkuperäinen koko on määrittänyt inicialCapacity ja oletuslatauskerroin on 0,75.
Hashtable ht = new Hashtable(int alkuperäinen kapasiteetti);
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);> > }> }> |
Lähtö
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {4=four, 6=six, 5=five} 3. Hashtable (sisäisen koko, kelluntatäyttösuhde): Tämä versio luo hash-taulukon, jonka alkuperäinen koko on määritetty fillRatio-määritteen koon ja täyttösuhteen mukaan. täyttösuhde: Pohjimmiltaan se määrittää, kuinka täynnä hash-taulukko voi olla ennen kuin sen kokoa muutetaan ylöspäin ja sen arvo on välillä 0,0 - 1,0.
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);> > }> }> |
Lähtö
Mappings of ht1 : {3=three, 2=two, 1=one} Mappings of ht2 : {6=six, 5=five, 4=four} 4. Hashtable (kartta m): Tämä luo hajautustaulukon, joka alustetaan m:n elementeillä.
Hashtable ht = uusi Hashtable(Kartta 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);> > }> }> |
Lähtö
Mappings of ht2 : {3=three, 2=two, 1=one} Esimerkki:
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);> > }> > }> }> |
Lähtö
Size of map is:- 3 {vaibhav=20, vishal=10, sachin=30} value for key 'vishal' is:- 10 Erilaisten toimintojen suorittaminen Hashtablella
1. Elementtien lisääminen: Elementin lisäämiseksi hashtable-taulukkoon voimme käyttää put()-menetelmää. Lisäysjärjestys ei kuitenkaan säily hash-taulukossa. Sisäisesti jokaiselle elementille luodaan erillinen tiiviste ja elementit indeksoidaan tämän tiivisteen perusteella sen tehostamiseksi.
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);> > }> }> |
Lähtö
Mappings of ht1 : {3=Geeks, 2=For, 1=Geeks} Mappings of ht2 : {3=Geeks, 2=For, 1=Geeks} 2. Elementtien muuttaminen: Kun elementit on lisätty, jos haluamme muuttaa elementtiä, se voidaan tehdä lisäämällä elementti uudelleen put()-metodilla. Koska hash-taulukon elementit indeksoidaan avaimilla, avaimen arvoa voidaan muuttaa yksinkertaisesti lisäämällä päivitetty arvo avaimelle, jota haluamme muuttaa.
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);> > }> }> |
Lähtö
Initial Map {3=Geeks, 2=Geeks, 1=Geeks} Updated Map {3=Geeks, 2=For, 1=Geeks} 3. Elementin poistaminen: Elementin poistamiseksi kartasta voimme käyttää Remove()-menetelmää. Tämä menetelmä ottaa avaimen arvon ja poistaa avaimen kartoituksen tästä kartasta, jos se on kartalla.
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);> > }> }> |
Lähtö
Initial map : {4=For, 3=Geeks, 2=For, 1=Geeks} Updated map : {3=Geeks, 2=For, 1=Geeks} 4. Hashtablen läpikäynti: Taulukon iteroimiseksi voimme käyttää an edistynyt silmukalle . Alla on esimerkki hash-taulukon iteroinnista.
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());> > }> }> |
Lähtö
vaibhav 20 vishal 10 sachin 30
Hashtablen sisäinen toiminta
Hashtable-tietorakenne on joukko segmenttejä, jotka tallentavat avain/arvo-parit niihin. Se hyödyntää hashCode() -menetelmä määrittääksesi, mikä ryhmä avain/arvo-parin tulee yhdistää.
Hajautustoiminto auttaa määrittämään tietyn avaimen sijainnin ämpäriluettelossa. Yleensä hashcode on ei-negatiivinen kokonaisluku, joka on yhtä suuri samansuuruisille objekteille ja voi olla tai ei ole sama eriarvoisille objekteille. Hashtable käyttää equals()-menetelmää määrittääkseen, ovatko kaksi objektia samanarvoisia vai eivät.
On mahdollista, että kahdella eri objektilla on sama hash-koodi. Tätä kutsutaan a törmäys . Hashtable käyttää törmäysten ratkaisemiseen joukkoa luetteloita. Parit, jotka on kartoitettu yhteen segmenttiin (taulukkoindeksi), tallennetaan luetteloon ja luetteloviittaukset tallennetaan taulukkoindeksiin.
Hashtablen menetelmät
- K – Kartan avainten tyyppi.
- SISÄÄN – Karttaan kartoitettujen arvojen tyyppi.
| MENETELMÄ | KUVAUS |
|---|---|
| asia selvä() | Tyhjentää tämän hashtablen niin, ettei se sisällä avaimia. |
| klooni() | Luo matalan kopion tästä hash-taulukosta. |
| compute(K-näppäin, BiFunction K,? Super V,? laajentaa V> remapping Function) | Yrittää laskea vastaavuuden määritetylle avaimelle ja sen nykyiselle yhdistetylle arvolle (tai nolla, jos nykyistä kartoitusta ei ole). |
| computeIfAbsent(K-näppäin, funktio laajentaa V> mappingFunction) | Jos määritettyä avainta ei ole jo liitetty arvoon (tai se on kuvattu nollaan), yrittää laskea sen arvon käyttämällä annettua kuvausfunktiota ja syöttää sen tähän karttaan, ellei se ole nolla. |
| computeIfPresent(K-näppäin, BiFunction-uudelleenkuvausfunktio) | Jos määritetyn avaimen arvo on läsnä ja ei ole nolla, yrittää laskea uuden kuvauksen avaimella ja sen nykyisellä kuvatulla arvolla. |
| sisältää (objektin arvo) | Testaa, osuuko jokin avain määritettyyn arvoon tässä hash-taulukossa. |
| sisältääKey(Objektiavain) | Testaa, onko määritetty objekti avain tässä hash-taulukossa. |
| sisältääValue(objektin arvo) | Palauttaa tosi, jos tämä hashtable yhdistää yhden tai useamman avaimen tähän arvoon. |
| elementit() | Palauttaa tämän hash-taulukon arvojen luettelon. |
| entrySet() | Palauttaa sarjanäkymän tämän kartan sisältämistä kartoituksista. |
| yhtä suuri (objekti o) | Vertaa määritettyä objektia tähän karttaan tasa-arvoisuuden vuoksi karttaliittymän määritelmän mukaisesti. |
| get (Objektiavain) | Palauttaa arvon, johon määritetty avain on kartoitettu, tai nollan, jos tämä kartta ei sisällä määritystä avaimelle. |
| hash koodin() | Palauttaa tämän kartan hash-koodin arvon karttaliittymän määritelmän mukaisesti. |
| on tyhjä() | Testaa, yhdistäkö tämä hashtable arvoihin avaimia. |
| avaimet () | Palauttaa luettelon tämän hash-taulukon avaimista. |
| keySet() | Palauttaa tämän kartan sisältämien avainten sarjanäkymän. |
| yhdistä (K-avain, V-arvo, BiFunction-uudelleenkuvaustoiminto) | Jos määritettyä avainta ei ole jo liitetty arvoon tai se on liitetty tyhjään, liittää sen annettuun ei-nolla-arvoon. |
| put(K-avain, V-arvo) | Yhdistää määritetyn avaimen määritettyyn arvoon tässä hash-taulukossa. |
| laita kaikki (kartta t) | Kopioi kaikki määritetyn kartan kartoitukset tähän hash-taulukkoon. |
| rehash() | Lisää tämän hash-taulukon kapasiteettia ja organisoi sen sisäisesti uudelleen, jotta sen merkintöjä voidaan mukauttaa ja käyttää tehokkaammin. |
| poista(Objektiavain) | Poistaa avaimen (ja sitä vastaavan arvon) tästä hash-taulukosta. |
| koko() | Palauttaa avainten määrän tässä hash-taulukossa. |
| toString() | Palauttaa tämän Hashtable-objektin merkkijonoesityksen merkintöjen muodossa, jotka on suljettu aaltosulkeilla ja erotettu ASCII-merkeillä , (pilkku ja välilyönti). |
| arvot() | Palauttaa kokoelmanäkymän tämän kartan sisältämistä arvoista. |
Käyttöliittymässä java.util.Map ilmoitetut menetelmät
| MENETELMÄ | KUVAUS |
|---|---|
| forEach (kaksikuluttajan toiminta) | Suorittaa annetun toiminnon jokaiselle tämän kartan merkinnälle, kunnes kaikki merkinnät on käsitelty tai toiminto tekee poikkeuksen. |
| getOrDefault(Objektiavain, V oletusarvo) | Palauttaa arvon, johon määritetty avain on yhdistetty, tai oletusarvon, jos tämä kartta ei sisällä avaimen määritystä. |
| putIfAbsent(K-avain, V-arvo) | Jos määritettyä avainta ei ole jo liitetty arvoon (tai se on kuvattu nollaan), liittää sen annettuun arvoon ja palauttaa nollan, muussa tapauksessa palauttaa nykyisen arvon. |
| poista(Objektiavain, Objektin arvo) | Poistaa määritetyn avaimen merkinnän vain, jos se on tällä hetkellä yhdistetty määritettyyn arvoon. |
| korvaa (K-avain, V-arvo) | Korvaa määritetyn avaimen merkinnän vain, jos se on tällä hetkellä yhdistetty johonkin arvoon. |
| korvaa (K avain, V vanha arvo, V uusi arvo) | Korvaa määritetyn avaimen merkinnän vain, jos se on tällä hetkellä yhdistetty määritettyyn arvoon. |
| korvaa kaikki (BiFunction-toiminto) | Korvaa jokaisen merkinnän arvon tuloksella, joka kutsuu kyseisessä merkinnässä annetun funktion, kunnes kaikki merkinnät on käsitelty tai funktio tekee poikkeuksen. |
Täytyy lukea:
- Erot HashMapin ja HashTablen välillä Javassa
Hashtablen edut:
- Säieturvallinen: Hashtable-luokka on säikeen turvallinen, mikä tarkoittaa, että useat säikeet voivat käyttää sitä samanaikaisesti aiheuttamatta tietojen vioittumista tai muita synkronointiongelmia.
- Helppokäyttöinen: Hashtable-luokka on helppokäyttöinen ja tarjoaa perusavainarvotietorakenteen toiminnallisuuden, josta voi olla hyötyä yksinkertaisissa tapauksissa.
Hashtablen haitat:
- Vanhentunut: Hashtable-luokkaa pidetään vanhentuneena, ja sen käyttöä ei yleensä suositella. Tämä johtuu siitä, että se on suunniteltu ennen Collections-kehyksen käyttöönottoa, eikä se toteuta Map-käyttöliittymää, mikä vaikeuttaa sen käyttöä yhdessä muiden kehyksen osien kanssa.
- Rajoitettu toiminnallisuus: Hashtable-luokka tarjoaa perusavainarvotietorakenteen toiminnallisuuden, mutta ei tarjoa kaikkia toimintoja, jotka ovat saatavilla Map-rajapinnassa ja sen toteutuksissa.
- Huono suorituskyky: Hashtable-luokka on synkronoitu, mikä voi johtaa hitaampaan suorituskykyyn verrattuna muihin Map-käyttöliittymän toteutuksiin, kuten HashMap tai ConcurrentHashMap.
Lähdekirjat:
- Maurice Naftalinin ja Philip Wadlerin Java-kokoelmat. Tämä kirja tarjoaa kattavan yleiskatsauksen Java Collections -kehyksestä, mukaan lukien Hashtable-luokasta.
- Java pähkinänkuoressa David Flanagan. Tämä kirja tarjoaa nopean viittauksen Javan ydinominaisuuksiin, mukaan lukien Hashtable-luokka.
- Maurice Naftalinin ja Philip Wadlerin Java Generics and Collections. Tämä kirja tarjoaa kattavan oppaan geneerisiin tuotteisiin ja kokoelmiin Javassa, mukaan lukien Hashtable-luokka.
Viite: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html