i det här inlägget ser vi hur HashSet internt fungerar i Java, vilket också är en favoritejava Samlingar intervjufråga men innan du går in i intern implementering av HashSet i Java är det viktigt att veta två punkter om HashSet.
- HashSet i Java lagrar bara unika värden, dvs inga dubbletter är tillåtna.
- HashSet fungerar på begreppet hashing precis som HashMap i Java men dess arbete skiljer sig från HashMap på följande sätt-
- i HashMap läggs ett (nyckel, värde) Par och hashfunktionen beräknas med nyckel.
- där som i HashSet hash-funktionen beräknas med hjälp av själva värdet. Observera att i HashSet har vi add (E e) metod som bara tar elementet som ska läggas till som parameter.
du kanske också har gissat nu, eftersom hashfunktionen beräknas med värde, varför endast uniquevalues lagras i HashSet. Om du försöker lagrasamma element igen, skulle den beräknade hashfunktionen vara densamma, så elementet kommer att skrivas över.
HashSet internt använder HashMap
nu kommer tillbaka till internt genomförande av HashSet i Java den viktigaste punkten är HashSet klass genomförande internt använder HashMap för att lagra det är element.
inom HashSet finns det många konstruktörer en utan någon parameter och flera till med initial kapacitet eller belastningsfaktor men var och en av dessa konstruktörer skapar en HashMap.Eftersom HashSet internt använder HashMap så att veta hur HashMap fungerar internt i Java hjälper dig att förstå hur HashSet fungerar internt i Java.
HashSet Constructor snippets
i HashSet-klassen i Java kan du se att konstruktörer av klassen skapar en 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);}
och Kartan, som används för att lagra värden, definieras som
private transient HashMap<E,Object> map;
i konstruktören, om du har märkt det finns parametrar som heter initial kapacitet och belastningsfaktor.För HashSet är standard initial Kapacitet 16, det vill säga en array (eller hink) med Längd 16 skulle skapas ochstandard belastningsfaktor är 0,75. Där lastfaktor är ett mått på hur fullt hashtabellen får komma innandess kapacitet ökas automatiskt.
hur element läggs till-HashSet intern implementering
jag uppgav i punkt 2 ovan att HashSet beräknar hashfunktionen med hjälp av själva värdet och det finns inget (nyckel, värde) par i HashSet och sedan kom uttalandet att HashSet internt använder HashMap för att lagra objekt.Dessa två uttalanden kan låta motsägelsefulla som HashMap butiker (nyckel, värde) par så låt oss se hur dessa dessa twocontradictory uttalanden håller sant.
faktiskt från add method of HashSet class put () metod för HashMap kallas där värdet, som måste läggas till i uppsättningen, blir nyckel och ett konstant objekt ”närvarande” används som värde.
så definieras PRESENT i HashSet-implementeringen-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
och det är hur add method implementeras i HashSet-klassen –
public boolean add(E e) { return map.put(e, PRESENT)==null;}
så du kan se med i den interna implementeringen av HashSet är det ett (nyckel, värde) par som faktiskt får added.It är bara att det faktiska värdet (som läggs till i HashSet) blir nyckeln och ett dummyvärde ”närvarande” läggs till som värde när det lagras i Backing HashMap.
till exempel ett uttalande för att lägga till ett element i HashSet – set.Lägg till (”Mumbai”); internt översätter till karta.put (”Mumbai”, närvarande); och sedan läggas till stöd HashMap instans.
en sak att notera här är att i HashMap-värdet kan vara duplikat men nyckeln ska vara unik. Så ser HashSet till att endast unika värden lagras i det, eftersom värdet som ska lagras i Hashsetblir nyckeln medan den lagras i HashMap.
hur elementet tas bort-HashSet intern implementering
när vi behöver ta bort ett element från HashSet, internt igen ta bort metoden för HashSetcalls ta bort(Objektnyckel) metod för HashMap.
det är så det implementeras i HashSet-klassen.
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
här notera att ta bort(Objektnyckel) metod för HashMap returnerar värdet associerat med nyckeln.Medan metoden remove (Object o) i HashSet returnerar booleskt värde. Vi vet också att för varje valueadded i HashSet, internt när det läggs till den tillhörande HashMap, värdet blir nyckeln och värdet är alltid anobject kallas närvarande. Därför är värdet som returneras från metoden remove(Object key) I HashMap alltid närvarande, alltså villkorskartan.ta bort (o)==närvarande.
hur element hämtas från HashSet i Java
i HashSet finns det ingen get-metod som anges i Karta eller lista. I HashSet iterator finns det som kommer att iteratethrough värdena för uppsättningen. Internt kommer det att ringa Nyckeluppsättningen i HashMap, eftersom värden lagras som tangenter i HashMap så vad vi får är de värden som lagras i HashSet.
så implementeras iterator internt i HashSet i 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();}
poäng att notera
- till skillnad från HashMap där hashfunktionen beräknas med nyckel använder HashSet själva värdet för att beräkna hashfunktionen.
- eftersom hashfunktionen beräknas med värde är det därför bara unika värden lagras i HashSet.
- HashSet använder internt HashMap för att lagra dess element.
- när elementet läggs till HashSet med add (E e) metod internt HashSet samtal put () metod för HashMap wherethe värdet passerade i add metoden blir nyckeln I put () metoden. Ett dummyvärde” PRESENT ” passeras som värde Iput () – metoden.
rekommendationer för lärande (Udemy kurser)
- Java Programming Masterclass Course
- Java fördjupad: bli en komplett Java Engineer!
- Spring Framework Master Class Course
- komplett Python Bootcamp-kurs
- Python för datavetenskap och maskininlärning
det är allt för detta ämne Hur HashSet fungerar internt i Java. Om du har några tvivel eller några förslag att göra vänligen släppa en kommentar. Tackar!
relaterade ämnen
- hur ArrayList fungerar internt i Java
- hur HashMap fungerar internt i Java
- hur LinkedList klass fungerar internt i Java
- LinkedHashSet i Java med exempel
- TreeSet i Java med exempel
du kanske också gillar-