Java Hungry
în Core Java Interviu Întrebări , este comun pentru a obține bombardat cu întrebări cadru de colectare . Am fost intervievat în Goldman Sachs și acolo mi-au pus o întrebare Unde m-am prostit . Intervievatorul a întrebat cum implementați Setul în Java, cu alte cuvinte funcționarea internă a Hashset sau cum funcționează hashset în java. Adică, cum se va asigura că fiecare element este unic fără a utiliza interfețe setate sau clase care implementează interfața setată .
Citește și : cum funcționează harta hash în java
am dat răspunsul , deși a calificat și Runda de interviu , dar răspunsul este departe de a fi satisfăcător .
așa că m-am întors acasă și am făcut niște cercetări . Deci, în cele din urmă am primit răspunsul și partajarea cu tine .
set implementare intern în Java
fiecare element din set este unic . Astfel încât nu există nici un element duplicat în set .
deci, în java, dacă vrem să adăugăm elemente în set, atunci vom scrie cod ca aceasta
public class JavaHungry { public static void main(string args) { // TODO auto-generat metoda Stub HashSet< obiect>hashset = New HashSet< obiect> (); hashset.adăuga(3); hashset.adăugați ("Java Hungry"); hashset.adăugați ("Blogspot"); sistem.afară.println ("Set este" + hashset); }}
acesta va imprima rezultatul : Set este
acum să adăugați element duplicat în codul de mai sus
public class JavaHungry { public static void main(string args) { HashSet<obiect> hashset = New HashSet<obiect>(); hashset.adăuga(3); hashset.adăugați ("Java Hungry"); hashset.adăugați ("Blogspot"); hashset.adăuga (3); / / elemente duplicat hashset.adăugați ("Java Hungry"); / / sistem de elemente duplicate.afară.println ("Set este" + hashset); }}
acesta va imprima rezultatul : Setul este
acum, ce se întâmplă intern când treceți elemente duplicate în metoda add() a obiectului Set , acesta va reveni fals și nu adăugați la HashSet , deoarece elementul este deja prezent .până acum atât de bine .
dar principala problemă apare că modul în care se întoarce fals . Deci, aici este răspunsul
când deschideți implementarea HashSet a add () metoda în API-uri Java, care este rt.jar , veți găsi următorul cod în el
public class HashSet <E > extinde AbstractSet< E > implementează Set< E >, Cloneable, java.io.Serializabil {HashMap tranzitoriu privat <e, obiect> hartă; / / valoare fictivă de asociat cu un obiect din harta Suport obiect final static privat prezent = obiect nou (); HashSet public () { hartă = HashMap nou<>(); } // unele cod, și anume alte metode în Hash Set Boolean publice adăuga (E e) { întoarcere hartă.pune (E, prezent) = = null;} / / unele cod, adică alte metode în set Hash}
deci, realizăm unicitatea în Set, intern în java prin HashMap . Ori de câte ori creați un obiect de HashSet se va crea un obiect de HashMap după cum puteți vedea în liniile cursive din Codul de mai sus .
am discutat deja cum funcționează HashMap intern în java .
după cum știm în HashMap fiecare cheie este unic . Deci, ceea ce facem în set este că trecem argumentul în add(Elemene E) care este E ca o cheie în HashMap . Acum trebuie să asociem o anumită valoare cheii, deci ceea ce a făcut dezvoltatorul API-urilor Java este să treacă valoarea falsă care este ( obiect nou () ) care este menționată prin referința obiectului prezent .
deci, de fapt, atunci când adăugați o linie în HashSet ca hashset.adăugați(3) ceea ce java face intern este că va pune acel element E aici 3 ca cheie în HashMap (creat în timpul creării obiectelor HashSet) și o valoare falsă care este obiectul obiectului este transmisă ca valoare cheii .
acum, dacă vedeți codul metodei HashMap put(cheie k,valoare V), veți găsi ceva de genul acesta
public v put (cheie K, valoare V) {
//un cod
}
punctul principal de observat în codul de mai sus este că put (cheie,valoare) va reveni
1. null, în cazul în care cheia este unic și a adăugat la harta
2. Valoarea veche a cheii, în cazul în care cheia este duplicat
Deci , în HashSet add() metoda , vom verifica valoarea returnată a hărții.metoda put(cheie,valoare) cu valoare nulă
adică
Adăugare booleană publică (E e) {
întoarcere hartă.put (e, prezent) = = null;