i dette indlæg vil vi se, hvordan HashSet internt fungerer i Java, hvilket også er et favoritjava Collections intervju spørgsmål, men inden vi går ind i intern implementering af HashSet i Java er det vigtigt at kende to punkter om HashSet.
- HashSet i Java gemmer kun unikke værdier, dvs.ingen dubletter er tilladt.
- HashSet fungerer på begrebet hashing ligesom HashMap i Java, men dets arbejde adskiller sig fra HashMap på følgende måde-
- i HashMap tilføjes et (nøgle, værdi) par, og hash-funktionen beregnes ved hjælp af nøgle.
- hvor som i HashSet hash-funktionen beregnes ved hjælp af selve værdien. Bemærk, at vi i HashSet har tilføjet (E e) metode, der kun tager det element, der skal tilføjes som parameter.
du har måske også gættet nu, da hash-funktionen beregnes ved hjælp af værdi, hvorfor kun unikke værdier gemmes i HashSet. Hvis du forsøger at gemesamme element igen, ville den beregnede hash-funktion være den samme, så elementet overskrives.
HashSet internt bruger HashMap
nu kommer tilbage til intern implementering af HashSet i Java Det vigtigste punkt er HashSet klasse implementering internt bruger HashMap til at gemme det elementer.
inden for HashSet er der mange konstruktører en uden nogen parameter og flere flere med indledende kapacitet eller belastningsfaktor, men hver enkelt af disse konstruktører opretter en HashMap.Da HashSet internt bruger HashMap, så at vide, hvordan HashMap fungerer internt i Java, hjælper dig med at forstå, hvordan HashSet fungerer internt i Java.
HashSet Constructor snippets
i HashSet-klassen i Java kan du se, at konstruktører af klassen opretter en HashMap.
/*** 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);}
og kortet, der bruges til lagring af værdier, er defineret som
private transient HashMap<E,Object> map;
i konstruktøren, hvis du har bemærket, er der parametre, der hedder initialkapacitet og belastningsfaktor.For HashSet er standard startkapacitet 16, Det vil sige en array (eller spand) med Længde 16 ville blive oprettet ogdefault load factor er 0,75. Hvor load factor er et mål for, hvor fuld hashtabellen får lov til at komme førdens kapacitet øges automatisk.
hvordan elementer tilføjes – HashSet intern implementering
jeg sagde i punkt 2 ovenfor, at HashSet beregner hash-funktionen ved hjælp af selve værdien og thereis ingen (nøgle, værdi) par i HashSet og så kom udsagnet om, at HashSet internt bruger HashMap til at gemme objekter.Disse to udsagn kan lyde modstridende, da HashMap-butikker (nøgle, værdi) par, så lad os se, hvordan disse to modstridende udsagn er sande.
faktisk fra add method of HashSet class put() metode til HashMap kaldes, hvor værdien, som skal tilføjes i sættet, bliver nøglen, og et konstant objekt “til stede” bruges som værdi.
sådan er til stede defineret i HashSet implementering-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
og det er sådan add metode er implementeret i HashSet klasse –
public boolean add(E e) { return map.put(e, PRESENT)==null;}
så du kan se med i den interne implementering af HashSet er det et (nøgle, værdi) par, som faktisk får added.It det er bare, at den faktiske værdi (som tilføjes til HashSet) bliver nøglen, og en dummyværdi “til stede” tilføjes som værdi, når den opbevares i backing HashMap.
for eksempel en erklæring for at tilføje et element til HashSet – sæt.tilføje (“Mumbai”); oversættes internt til kort.sætte (“Mumbai”, til stede); og derefter tilføjet til backing HashMap instans.
en ting at bemærke her er, i HashMap-værdi kan være duplikat, men nøglen skal være unik. Sådan er Hashsetsørger for, at kun unikke værdier gemmes i den, da den værdi, der skal gemmes i Hashsetbliver nøglen, mens den gemmes i HashMap.
hvordan element er fjernet – HashSet intern implementering
når vi har brug for at fjerne et element fra HashSet, internt igen fjerne metode HashSetcalls fjerne(objekt nøgle) metode HashMap.
Sådan implementeres det i HashSet klasse.
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
her bemærk, at fjern(Objektnøgle) metode til HashMap returnerer den værdi, der er knyttet til nøglen.Mens metoden fjern (objekt o) for HashSet returnerer boolsk værdi. Vi ved også, at for hver værditilføjet i HashSet, internt, når det føjes til den tilknyttede HashMap, værdi bliver nøglen, og værdien kaldes altid ANOBJECT til stede. Derfor er den værdi, der returneres fra HashMap ‘ ens fjern(Objektnøgle) metode, altid til stede således tilstandskortet.fjern (o)==til stede.
hvordan elementer hentes fra HashSet i Java
i HashSet er der ingen get-metode som angivet i kort eller liste. I HashSet iterator er der som vil iteratgennem værdierne af sættet. Internt vil det kalde nøglen til HashMap, da værdier gemmes som nøgleri HashMap, så hvad vi får er de værdier, der er gemt i HashSet.
Sådan implementeres iterator internt i HashSet i Java.
/*** 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();}
peger på note
- i modsætning til HashMap, hvor hash-funktionen beregnes ved hjælp af nøgle HashSet bruger selve værdien til at beregne hash-funktionen.
- da hash-funktionen beregnes ved hjælp af værdi, er det derfor kun unikke værdier gemmes i HashSet.
- HashSet bruger internt HashMap til at gemme dets elementer.
- når element tilføjes til HashSet ved hjælp af add(E e) – metoden internt hashset kalder put () – metoden for HashMap, hvor værdien, der overføres i add-metoden, bliver nøglen i put () – metoden. En dummy værdi” til stede ” er bestået som værdi Iput() metode.
anbefalinger til læring (Udemy kurser)
- Java Programmering Masterclass kursus
- Java i dybden: Bliv en komplet Java ingeniør!
- forår ramme Master Class kursus
- komplet Python Bootcamp kursus
- Python for Data Science and Machine Learning
det er alt for dette emne, Hvordan HashSet fungerer internt i Java. Hvis du er i tvivl eller forslag til at komme med, så send en kommentar. Tak!
relaterede emner
- hvordan ArrayList fungerer internt i Java
- hvordan HashMap fungerer internt i Java
- hvordan LinkedList klasse fungerer internt i Java
- LinkedHashSet i Java med eksempler
- TreeSet i Java med eksempler
du kan også lide-