Java Hungry
i core java interview questions är det vanligt att bombarderas med Samlingsramfrågor . Jag intervjuades i Goldman Sachs, och där ställde de en fråga där jag blev dumbstruck . Intervjuaren frågade hur implementerar du Set i Java med andra ord internt arbete av Hashset eller hur hashset fungerar i java. Det är , hur kommer att se till att varje element är unik utan att använda Set gränssnitt eller klasser som implementerar Set gränssnitt .
Läs och: hur hash map fungerar i java
jag gav svaret, även om jag kvalificerade intervjurundan också, men svaret är långt ifrån tillfredsställande .
så jag kom tillbaka hem och gjorde lite forskning . Så äntligen fick jag svaret och delade det med dig .
ange implementering internt i Java
varje element i uppsättningen är unik . Så att det inte finns något dubblettelement I set .
så i java Om vi vill lägga till element i uppsättningen skriver vi kod så här
public class JavaHungry { public static void main(String args) { // TODO Auto-genererad metod stub HashSet<objekt> hashset = new HashSet<objekt>(); hashset.Lägg till (3); hashset.Lägg till ("Java hungrig"); hashset.Lägg till ("Blogspot"); systemet.ut.println ("Set är" + hashset); }}
det kommer att skriva ut resultatet : Set är
låt nu lägga dubbla element i ovanstående kod
Offentlig klass JavaHungry { public static void main(String args) { HashSet< objekt>hashset = new HashSet< objekt> (); hashset.Lägg till (3); hashset.Lägg till ("Java hungrig"); hashset.Lägg till ("Blogspot"); hashset.Lägg till (3); // duplicera element hashset.Lägg till ("Java hungrig"); / / duplicate elements System.ut.println ("Set är" + hashset); }}
det kommer att skriva ut resultatet : Set är
nu, vad händer internt när du skickar dubbla element i add () – metoden för Set-objektet , kommer det att returnera falskt och lägg inte till HashSet , eftersom elementet redan är närvarande .hittills så bra .
men det största problemet uppstår att hur det returnerar FALSKT . Så här är svaret
när du öppnar HashSet-implementeringen av Add () – metoden i Java API: er som är rt.jar , hittar du följande kod i den
Offentlig klass HashSet<E> utökar AbstractSet<E> implementerar Set<E >, Cloneable, java.io.Serializable{ privat transient HashMap <E, objekt> map; / / Dummy värde att associera med ett objekt i bakgrunden kartan privat statiskt slutligt objekt närvarande = nytt objekt (); Offentlig HashSet () { map = ny HashMap<>(); } // någon kod, dvs andra metoder i Hash Set public boolean add (E e) { return map.put (e, PRESENT)= = null;} / / någon kod, dvs andra metoder i Hash Set}
så vi uppnår unikhet i Set, internt i java genom HashMap . När du skapar ett objekt av HashSet kommer det att skapa ett objekt av HashMap som du kan se i kursiv rader i ovanstående kod .
vi diskuterade redan hur HashMap fungerar internt i java .
som vi vet i HashMap är varje nyckel unik . Så vad vi gör i uppsättningen är att vi passerar argumentet i add(Elemene E) som är E som en nyckel i HashMap . Nu måste vi associera något värde till nyckeln, så vad Java API-utvecklare gjorde är att skicka Dummyvärdet som är ( nytt objekt () ) som hänvisas av Objektreferens närvarande .
så, faktiskt när du lägger till en rad i HashSet som hashset.Lägg till(3) Vad java gör internt är att det kommer att sätta det elementet e här 3 som en nyckel i HashMap (skapad under HashSet object creation) och något dummyvärde som är objektets objekt skickas som ett värde till nyckeln .
nu om du ser koden för HashMap put (Key k,Value V) – metoden hittar du något så här
public V put(K key, V value) {
//någon kod
}
huvudpunkten att märka i ovanstående kod är att put (key,value) kommer att returnera
1. null, om nyckeln är unik och läggs till på kartan
2. Gammalt värde på nyckeln, om nyckeln är duplicerad
så , i HashSet add () – metoden , kontrollerar vi returvärdet för kartan.sätt (nyckel,värde) metod med null värde
dvs
public boolean add(E e) {
retur karta.put (E, närvarande)= = null;