tässä viestissä näemme, miten HashSet sisäisesti toimii Java, joka on myös favoritejava kokoelmat haastattelu kysymys, mutta ennen kuin menee sisäiseen toteuttamiseen HashSet Java on tärkeää tietää kaksi pistettä HashSet.
- HashSet Javassa tallentaa vain uniikkeja arvoja eli kaksoiskappaleita ei sallita.
- HashSet toimii hashmapin käsitteellä aivan kuten HashMap Javassa, mutta sen työskentely eroaa Hashmapista seuraavalla tavalla-
- Hashmapissa lisätään pari (avain, arvo) ja hash-funktio lasketaan avaimen avulla.
- missä kuten HashSet-hash-funktiossa lasketaan käyttäen itse arvoa. Huomaa, että Hashsetissa meillä on add (E e) – menetelmä, joka ottaa vain lisättävän elementin parametriksi.
myös Olet ehkä jo arvannut, koska hash-funktio lasketaan arvolla, minkä vuoksi vain uniquevalues tallennetaan Hashsetiin. Jos yrität tallentaa saman elementin uudelleen, laskettu hajautusfunktio olisi sama, jolloin Elementti korvataan.
HashSet sisäisesti käyttää HashMap
nyt tulossa takaisin sisäiseen toteutukseen HashSet Java tärkein kohta on HashSet luokan toteutus sisäisesti käyttää HashMap tallentaa sen elementtejä.
Hashsetin sisällä on monia rakentajia, joista yksi ei sisällä mitään parametria, ja useita muita, joilla on alkukapasiteetti tai kuormituskerroin, mutta jokainen näistä rakentajista luo Hashmapin.Koska HashSet sisäisesti käyttää HashMap niin tietäen, miten HashMap toimii sisäisesti Java auttaa sinua ymmärtämään, miten HashSet toimii sisäisesti Java.
HashSet Constructor-pätkät
Javan HashSet-luokassa voi nähdä, että luokan rakentajat luovat Hashmapin.
/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* default initial capacity (16) and load factor (0.75).*/public HashSet() { map = new HashMap<>();}
public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor);}
ja kartta, jota käytetään arvojen tallentamiseen, on määritelty
private transient HashMap<E,Object> map;
konstruktorissa, jos olet huomannut, on olemassa parametrejä nimeltään alkutilavuus ja kuormituskerroin.HashSet, oletuksena aloituskapasiteetti on 16, joka on array (tai ämpäri) Pituus 16 olisi luotu anddefault kuormituskerroin on 0,75. Jossa kuormituskerroin on mitta siitä, kuinka täyteen hajautustaulukon annetaan saada ennen kuin sen kapasiteetti kasvaa automaattisesti.
kuinka elementtejä lisätään – HashSet sisäinen toteutus
kerroin edellä 2 kohdassa, että HashSet laskee hash-funktion käyttämällä arvoa itse eikä Hashsetissa ole (avain, arvo) paria, ja sitten tuli lausunto, että HashSet käyttää sisäisesti hashmapia esineiden tallentamiseen.Nämä kaksi lausumaa saattavat kuulostaa ristiriitaisilta HashMap-myymälöinä (avain, arvo), joten katsotaan, miten nämä kaksi kontradiktorista lausumaa pitävät paikkansa.
itse asiassa HashSet-luokan put () – menetelmästä kutsutaan hashmapin menetelmää, jossa arvo, joka on lisättävä joukkoon, muuttuu avaimeksi ja arvona käytetään vakio-objektia ”läsnä”.
näin preesens määritellään HashSet-toteutuksessa-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
ja näin add-menetelmä toteutetaan HashSet-luokassa –
public boolean add(E e) { return map.put(e, PRESENT)==null;}
joten voit nähdä sisäisessä toteutuksessa HashSet se on (avain, arvo) pari, joka on todella saada added.It ’ s vain, että todellinen arvo (joka lisätään HashSet) tulee avain ja dummy arvo ”läsnä” lisätään arvona, kun tallentaminen sitä tausta HashMap.
esimerkiksi lauseke elementin lisäämisestä Hasset-joukkoon.add (”Mumbai”); sisäisesti kääntää kartaksi.put (’Mumbai’, preesens); ja sitten lisätään Tausta HashMap-ilmentymään.
yksi asia tässä on, että HashMap-arvo voi olla kahdentunut, mutta avaimen tulee olla yksilöllinen. Näin HashSet varmistaa, että siihen tallennetaan vain ainutlaatuisia arvoja, sillä arvo, joka on tarkoitus tallentaa siihen, muuttuu avaimeksi, kun se tallennetaan Hashmapiin.
miten elementti poistetaan – HashSet sisäinen toteutus
kun meidän täytyy poistaa elementti HashSet, sisäisesti jälleen poistaa menetelmä HashSetcalls poista(Object key) menetelmä HashMap.
näin se toteutetaan Hasset-luokassa.
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
huomaa tässä, että hashmapin remove(Object key) – menetelmä palauttaa avaimeen liittyvän arvon.Kun taas hashsetin poista (objekti o) – menetelmä palauttaa Boolean-arvon. Tiedämme myös, että jokaiselle lisäarvolle, joka on lisätty Hassetiin, sisäisesti, kun se lisätään siihen liittyvään Hashmapiin, arvosta tulee avain ja arvo on aina ANOBJECT nimeltään PRESENT. Siksi arvo, joka palautetaan poista (objekti avain) menetelmä HashMap on aina läsnä siten ehto kartta.poista (o)==läsnä.
miten elementit haetaan Hashsetista Javassa
Hashsetissa ei ole kartan tai luettelon mukaista get-menetelmää. Vuonna HashSet iteraattori on olemassa, joka iteratethrough arvot asetettu. Sisäisesti se kutsuu hashmapin avainta, koska arvot tallennetaan avaimina Hashmapiin, joten saamme hašmapiin tallennetut arvot.
näin iteraattori on sisäisesti toteutettu Javan Hashsetissa.
/*** Returns an iterator over the elements in this set. The elements* are returned in no particular order.** @return an Iterator over the elements in this set* @see ConcurrentModificationException*/public Iterator<E> iterator() { return map.keySet().iterator();}
huomautettavaa
- toisin kuin Hashmapissa, jossa hash-funktio lasketaan avainhashsetin avulla, käytetään itse arvoa hash-funktion laskemiseen.
- koska hash-funktio lasketaan arvon avulla, siksi vain yksilölliset arvot tallennetaan Hashsetiin.
- HashSet käyttää sisäisesti hashmapia elementtiensä tallentamiseen.
- kun elementti lisätään Hashsetiin add (E e) – menetelmällä, sisäisesti HashSet kutsuu put () – menetelmää, jossa add-menetelmässä ohitetusta arvosta tulee avain put () – menetelmässä. Dummy-arvo ”PRESENT” hyväksytään arvoksi put () – menetelmässä.
oppimissuositukset (Udemyn kurssit)
- Java Programming Masterclass Course
- Java in-Depth: Become a Complete Java Engineer!
- Spring Framework Master Class Course
- Complete Python Bootcamp Course
- Python for Data Science and Machine Learning
that ’ s all for this topic How HashSet Works Internally in Java. Jos sinulla on epäilyksiä tai ehdotuksia tehdä, jätä kommentti. Kiitti!
aiheeseen liittyviä aiheita
- miten ArrayList toimii sisäisesti Javassa
- miten HashMap toimii sisäisesti Javassa
- miten LinkedList-luokka toimii sisäisesti Javassa
- Linkedhasset Javassa esimerkkien kanssa
- TreeSet Javassa esimerkkien kanssa
- TreeSet Javassa esimerkkien kanssa
sinäkin voit pitää –