în acest post vom vedea cum funcționează HashSet intern în Java, care este, de asemenea, un favouriteJava colecții Interviu Întrebare, dar înainte de a intra în punerea în aplicare internă a HashSet în Java, este important să se cunoască două puncte despre HashSet.
- HashSet în Java stochează numai valori unice, adică nu sunt permise duplicate.
- HashSet funcționează pe conceptul de hashing la fel ca HashMap în Java, dar lucrul său diferă de HashMap în felul următor-
- în HashMap se adaugă o pereche (cheie, valoare) și funcția hash este calculată folosind cheia.
- unde ca în funcția HashSet hash este calculată folosind valoarea în sine. Rețineți că în HashSet wehave add(e e) metoda care ia doar elementul care urmează să fie adăugate ca parametru.
de asemenea, este posibil să fi ghicit până acum, deoarece funcția hash este calculată folosind valoarea de aceea numai valori unice sunt stocate în HashSet. Dacă încercați să stocați din nou același element, funcția hash calculată ar fi aceeași, astfel elementul va fi suprascris.
HashSet utilizează intern HashMap
acum revenind la implementarea internă a HashSet în Java cel mai important punct este implementarea clasei HashSet utilizează intern HashMap pentru a stoca elementele sale.
în HashSet există mulți constructori unul fără niciun parametru și mai mulți cu capacitate inițială sau factor de încărcare, dar fiecare dintre acești constructori creează un HashMap.Deoarece HashSet utilizează intern HashMap, știind cum funcționează HashMap intern în Java vă va ajuta să înțelegeți cum funcționează HashSet intern în Java.
fragmente de Constructor HashSet
în clasa HashSet în Java puteți vedea că Constructorii clasei creează un 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);}
și harta, care este utilizată pentru stocarea valorilor, este definită ca
private transient HashMap<E,Object> map;
în constructor, dacă ați observat, există parametri numiți capacitate inițială și factor de încărcare.Pentru HashSet, capacitatea inițială implicită este 16, adică ar fi creată o matrice (sau găleată) de lungime 16 și factorul de încărcare implicit este 0.75. În cazul în care factorul de încărcare este o măsură a cât de complet este permis tabelul hash înaintecapacitatea sa este crescută automat.
cum se adaugă elementele – implementarea internă HashSet
am afirmat în punctul 2 de mai sus că HashSet calculează funcția hash folosind valoarea în sine și nu există nicio pereche (cheie, valoare) în HashSet și apoi a venit afirmația că HashSet folosește intern HashMap pentru a stoca obiecte.Aceste două afirmații pot suna contradictorii ca magazine HashMap (cheie, valoare) pereche deci, să vedem cum aceste aceste declarații twocontradictory dețin adevărat.
de fapt, de la add metoda de clasa HashSet put () metoda de HashMap este numit în cazul în care valoarea, care trebuie să beadded în setul, devine cheie și un obiect constant „prezent” este folosit ca valoare.
așa este definit prezentul în implementarea HashSet-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
și așa este implementată metoda add în clasa HashSet –
public boolean add(E e) { return map.put(e, PRESENT)==null;}
Deci, puteți vedea cu în punerea în aplicare internă a HashSet este o pereche (cheie, valoare), care este de fapt obtinerea added.It doar că valoarea reală (care se adaugă la HashSet) devine cheia și o valoare fictivă „prezent” este adăugată ca valoare atunci cândstoring-o în HashMap suport.
de exemplu, o declarație pentru adăugarea unui element la HashSet – set.adăugați („Mumbai”); se traduce intern în hartă.Pune („Mumbai”, prezent); și apoi adăugat la instanța HashMap suport.
un lucru de remarcat aici este, în valoare HashMap poate fi duplicat, dar cheia ar trebui să fie unic. Acesta este modul în care Hashsetse asigură că numai valorile unice sunt stocate în el, deoarece valoarea care urmează să fie stocată în Hashsetdevine cheia în timp ce o stochează în HashMap.
cum element este eliminat – punerea în aplicare internă HashSet
când avem nevoie pentru a elimina un element din HashSet, pe plan intern elimina din nou metoda de HashSetcalls elimina(cheie obiect) metoda de HashMap.
acesta este modul în care este implementat în clasa HashSet.
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
aici rețineți că eliminare(cheie obiect) metoda HashMap returnează valoarea asociată cu cheia.În timp ce metoda Eliminare(obiect o) a HashSet returnează valoarea booleană. De asemenea, știm că pentru fiecare valueadded în HashSet, intern atunci când este adăugat la HashMap asociat, valoarea devine cheie și valoarea este întotdeauna anobject numit prezent. Prin urmare, valoarea care este returnată din metoda eliminare(cheie obiect) a HashMap este întotdeauna prezentă astfel harta condiție.eliminați (o)==prezent.
cum elementele sunt preluate din HashSet în Java
în HashSet nu există nici o metodă get așa cum este prevăzut în hartă sau listă. În HashSet iterator există care va iteraprin valorile setului. Pe plan intern se va apela setul de taste al HashMap, deoarece valorile sunt stocate ca chei în HashMap, astfel încât ceea ce vom obține sunt valorile stocate în HashSet.
acesta este modul în care iteratorul este implementat intern în HashSet în 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();}
puncte de notat
- spre deosebire de HashMap unde funcția hash este calculată folosind cheia HashSet folosește valoarea în sine pentru a calcula funcția hash.
- deoarece funcția hash este calculată folosind valoarea, de aceea numai valorile unice sunt stocate în HashSet.
- HashSet utilizează intern HashMap pentru a stoca elementele sale.
- când elementul este adăugat la HashSet folosind metoda add(e e) intern HashSet calls put() metoda HashMap unde valoarea trecută în metoda add devine cheie în metoda put (). O valoare falsă „prezent” este trecută ca valoare înmetoda put ().
recomandări pentru învățare (cursuri Udemy)
- programare Java curs Masterclass
- Java în profunzime: deveniți un inginer Java complet!
- curs Spring Framework Master Class
- curs complet Python Bootcamp
- Python pentru știința datelor și învățarea automată
asta e tot pentru acest subiect cum funcționează HashSet intern în Java. Dacă aveți orice îndoială sau orice sugestii pentru a face vă rugăm să picătură un comentariu. Mulțumesc!
subiecte înrudite
- cum ArrayList funcționează intern în Java
- cum HashMap funcționează intern în Java
- cum LinkedList class funcționează intern în Java
- LinkedHashSet în Java cu exemple
- TreeSet în Java cu exemple
ați putea dori, de asemenea-