GeeksforGeeks

som vi ved, at et sæt er en veldefineret samling af forskellige objekter. Hvert medlem af et sæt kaldes et element i sættet. Så med andre ord kan vi sige, at et sæt aldrig vil indeholde duplikatelementer. Men hvordan i java sæt interface implementeret klasser som HashSet, LinkedHashSet, TreeSet etc. opnå denne unikhed. I dette indlæg vil vi diskutere den skjulte sandhed bag denne unikhed.

hvordan HashSet fungerer internt i Java?

opmærksomhed læser! Stop ikke med at lære nu. Få fat i alle de vigtige Java Foundation og Collections koncepter med de grundlæggende elementer i Java og Java Collections kursus til en studievenlig pris og blive industri klar. For at fuldføre din forberedelse fra at lære et sprog til DS Algo og mange flere, henvises komplet samtale forberedelse kursus.

hvordan Set / HashSet fungerer internt i Java
vi forstår dette med et eksempel.Lad os se output fra følgende program, der forsøger at tilføje duplikatelementer i et HashSet.

import java.util.HashSet;
class Test
{
public static void main(String args)
{
HashSet hs = new HashSet();
boolean b1 = hs.add("Geeks");
boolean b2 = hs.add("GeeksforGeeks");
boolean b3 = hs.add("Geeks");
System.out.println("b1 = "+b1);
System.out.println("b2 = "+b2);
System.out.println("b3 = "+b3);
System.out.println(hs);
}
}



Output:

b1 = trueb2 = trueb3 = false

nu fra output er det klart, at når vi forsøger at tilføje et duplikatelement til et sæt ved hjælp af add () – metoden, returnerer det falsk, og element føjes ikke til hashset, da det allerede er til stede. Nu kommer spørgsmålet, hvordan add () – metoden kontrollerer, om sættet allerede indeholder det angivne element eller ej. Det vil være mere klart, hvis vi har et nærmere kig på add() metode og standard konstruktør i HashSet klasse.

// predefined HashSet classpublic class HashSet{ // A HashMap object private transient HashMap map; // A Dummy value(PRESENT) to associate with an Object in the Map private static final Object PRESENT = new Object(); // default constructor of HashSet class // It creates a HashMap by calling // default constructor of HashMap class public HashSet() { map = new HashMap(); } // add method // it calls put() method on map object // and then compares it's return value with null public boolean add(E e) { return map.put(e, PRESENT)==null; } // Other methods in Hash Set}

nu som du kan se, at når vi opretter et HashSet, opretter det internt en HashMap, og hvis vi indsætter et element i dette HashSet ved hjælp af add () – metoden, kalder det faktisk put () – metoden på internt oprettet HashMap-objekt med element, du har angivet som det er nøgle og konstant objekt kaldet “nuværende” som det er værdi. Så vi kan sige, at et sæt opnår unikhed internt gennem HashMap. Nu kommer hele historien om, hvordan en HashMap og put () – metode internt fungerer.

som vi ved i en HashMap er hver nøgle unik, og når vi kalder put(Key, Value) metode, returnerer den den tidligere værdi, der er knyttet til key, eller null, hvis der ikke var nogen kortlægning for key. Så I add () metode kontrollerer vi returværdien af kort.put (nøgle, værdi) metode med null værdi.

  1. hvis kort.put (nøgle, værdi) returnerer null, derefter sætningen “kort.put (e, PRESENT) = = null” vil returnere sand og element føjes til HashSet(internt HashMap).
  2. hvis kort.put (nøgle, værdi) returnerer den gamle værdi af nøglen og derefter udsagnet “kort.put (e, PRESENT) = = null” vil returnere falsk og element er ikke tilføjet til HashSet(internt HashMap).

som LinkedHashSet udvider HashSet, så det internt kalder konstruktører af HashSet ved hjælp af super(). På samme måde skaber et objekt af TreeSet klasse internt objekt af navigerbare kort som backing kort.

relateret artikel : Hvordan HashMap internt fungerer i Java.

denne artikel er bidraget af Gaurav miglani. Hvis du kan lide GeeksforGeeks og gerne vil bidrage, kan du også skrive en artikel ved hjælp af contribute.geeksforgeeks.org eller mail din artikel til [email protected]. se din artikel vises på GeeksforGeeks hovedsiden og hjælpe andre nørder.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.