Java Hungry
i centrale java-samtalespørgsmål er det almindeligt at blive bombarderet med Indsamlingsrammespørgsmål . Jeg blev afhørt i Goldman Sachs, og der stillede de et spørgsmål, hvor jeg blev dum . Intervjuet spurgte, hvordan implementerer du Set i Java med andre ord intern bearbejdning af Hashset eller hvordan hashset fungerer i java. Det vil sige, hvordan vil sørge for hver eneste element er unik uden at bruge sæt grænseflader eller klasser, der implementerer sæt Interface .
Læs også: hvordan hash map fungerer i java
jeg gav svaret, selvom jeg også kvalificerede samtalerunden, men svaret er langt fra tilfredsstillende .
så jeg kom hjem og lavede noget research . Så endelig fik jeg svaret og delte det med dig .
Indstil implementering internt i Java
hvert element i sættet er unikt . Så der er ikke noget duplikatelement i sæt .
så i java, hvis vi vil tilføje elementer i sættet, skriver vi kode som denne
offentlig klasse JavaHungry { public static void main(String args) { // TODO Auto-generated method stub HashSet<Object> hashset = ny HashSet<Object>(); hashset.tilføje (3); hashset.tilføje ("Java sulten"); hashset.tilføje ("Blogspot"); System.uden.println ("sæt er" + hashset); }}
det vil udskrive resultatet : Sæt er
lad nu tilføje duplikatelement i ovenstående kode
offentlig klasse JavaHungry { public static void main(String args) { HashSet< objekt>hashset = nyt HashSet< objekt > (); hashset.tilføje (3); hashset.tilføje ("Java sulten"); hashset.tilføje ("Blogspot"); hashset.tilføje (3); / / duplicate elements hashset.Tilføj ("Java Hungry"); / / duplicate elements System.uden.println ("sæt er" + hashset); }}
det vil udskrive resultatet : Set er
nu, Hvad sker der internt , når du passerer duplikatelementer i tilføjelsesmetoden() for det indstillede objekt , vil det returnere falsk og ikke tilføje til HashSet, da elementet allerede er til stede .indtil videre så godt .
men det største problem opstår, at hvordan det returnerer FALSK . Så her er svaret
når du åbner HashSet implementeringen af add () metoden i Java API ‘ er, der er rt.jar , finder du følgende kode i den
offentlig klasse HashSet<E>udvider AbstractSet<E>implementerer sæt<E>, Klonbar, java.io.Serialiserbar{ privat forbigående HashMap<E, objekt > kort; / / Dummy værdi at knytte til et objekt i backing Map privat statisk slutobjekt til stede = nyt objekt (); offentlig HashSet () { kort = ny HashMap<>(); } // nogle kode, dvs andre metoder i Hash sæt offentlig boolsk add (E e) { return map.put (e, PRESENT)==null; } // nogle kode ,dvs andre metoder i Hash sæt}
så vi opnår unikhed i sæt, internt i java gennem HashMap . Når du opretter et objekt med HashSet, opretter det et objekt med HashMap, som du kan se i kursiv linjer i ovenstående kode .
vi diskuterede allerede, hvordan HashMap fungerer internt i java .
som vi ved I HashMap er hver nøgle unik . Så hvad vi gør i sættet er, at vi passerer argumentet i add(Elemene E), der er E som en nøgle i HashMap . Nu er vi nødt til at knytte en vis værdi til nøglen , så hvad Java API ‘ er udvikler gjorde, er at passere Dummy værdi, der er ( nyt objekt ()), som er henvist af objekt reference til stede .
så faktisk når du tilføjer en linje i HashSet som hashset.tilføj (3) Hvad java gør internt er, at det vil sætte dette element E her 3 som en nøgle i HashMap(oprettet under oprettelse af HashSet-objekt), og en dummy-værdi, der er objektets objekt, overføres som en værdi til nøglen .
hvis du nu ser koden til HashMap put(Key k,Value V) – metoden , finder du noget som dette
public V put (K key, v value) {
//some code
}
hovedpunktet at bemærke i ovenstående kode er,at put (key, value) vender tilbage
1. null, hvis nøglen er unik og tilføjet til kortet
2. Gammel værdi af nøglen , hvis nøglen er duplikeret
så i HashSet add () – metoden kontrollerer vi returværdien af kortet.put(nøgle,værdi) metode med null værdi
dvs.
offentlig boolsk add (E e) {
return map.sætte (e, til stede)= = null;