Tech Tutorials

In diesem Beitrag werden wir sehen, wie HashSet intern in Java funktioniert, was auch ein Favorit istJava Collections Interview Frage, aber bevor Sie in die interne Implementierung von HashSet in Java gehen, ist es wichtig, zwei Punkte über HashSet zu wissen.

  1. HashSet in Java speichert nur eindeutige Werte, dh es sind keine Duplikate zulässig.
  2. HashSet funktioniert nach dem Konzept des Hashing genau wie HashMap in Java, aber seine Funktionsweise unterscheidet sich von der HashMap auf folgende Weise –
    • In HashMap wird ein (Schlüssel, Wert) -Paar hinzugefügt und die Hash-Funktion wird mit key berechnet.
    • Wobei wie in der HashSet-Hash-Funktion der Wert selbst berechnet wird. Beachten Sie, dass wir in HashSet die Methode add(E e) haben, die nur das hinzuzufügende Element als Parameter verwendet.

    Vielleicht haben Sie es auch schon erraten, da die Hash-Funktion mit dem Wert berechnet wird, werden im HashSet nur uniquevalues gespeichert. Wenn Sie versuchen, dasselbe Element erneut zu speichern, ist die berechnete Hash-Funktion dieselbe, sodass das Element überschrieben wird.

HashSet verwendet intern HashMap

Zurück zur internen Implementierung von HashSet in Java Der wichtigste Punkt ist, dass die Implementierung der HashSet-Klasse intern HashMap zum Speichern ihrer Elemente verwendet.

Innerhalb des HashSets gibt es viele Konstruktoren, einen ohne Parameter und mehrere weitere mit anfänglicher Kapazität oder Lastfaktor, aber jeder dieser Konstruktoren erstellt eine HashMap.Da HashSet intern HashMap verwendet, hilft Ihnen das Wissen, wie HashMap intern in Java funktioniert, zu verstehen, wie HashSet intern in Java funktioniert.

HashSet-Konstruktor-Snippets

In der HashSet-Klasse in Java können Sie sehen, dass Konstruktoren der Klasse eine HashMap erstellen.

/*** 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);}

Und die Karte, die zum Speichern von Werten verwendet wird, ist definiert als

private transient HashMap<E,Object> map;

Wenn Sie im Konstruktor bemerkt haben, gibt es Parameter mit den Namen Anfangskapazität und Lastfaktor.Für HashSet ist die standardmäßige Anfangskapazität 16, dh ein Array (oder Bucket) der Länge 16 würde erstellt und der Standardladefaktor ist 0,75. Wobei der Lastfaktor ein Maß dafür ist, wie voll die Hash-Tabelle sein darf, bevor ihre Kapazität automatisch erhöht wird.

Wie Elemente hinzugefügt werden – Interne Implementierung von HashSet

Ich habe in Punkt 2 oben angegeben, dass HashSet die Hash-Funktion unter Verwendung des Werts selbst berechnet und es kein (Schlüssel-, Wert-) Paar in HashSet gibt und dann kam die Anweisung, dass HashSet intern HashMap zum Speichern von Objekten verwendet.Diese beiden Aussagen mögen widersprüchlich klingen, da HashMap (Schlüssel, Wert) speichert, also lasst uns sehen, wie diese beiden widersprüchlichen Aussagen wahr sind.

Tatsächlich wird von der Add-Methode der HashSet-Klasse die put() -Methode von HashMap aufgerufen, bei der der Wert, der in der Menge hinzugefügt werden muss, zum Schlüssel wird und ein konstantes Objekt „PRESENT“ als Wert verwendet wird.

So ist PRESENT in der HashSet-Implementierung definiert-

// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();

Und so wird die Add-Methode in der HashSet-Klasse implementiert –

public boolean add(E e) { return map.put(e, PRESENT)==null;} 

Sie können also in der internen Implementierung des HashSets sehen, dass es sich um ein (Schlüssel-, Wert-) Paar handelt, das tatsächlich erhalten wird added.It Es ist nur so, dass der tatsächliche Wert (der dem HashSet hinzugefügt wird) zum Schlüssel wird und ein Dummy-Wert „PRESENT“ als Wert hinzugefügt wird, wenn er in der Backing-HashMap gespeichert wird.

Zum Beispiel eine Anweisung zum Hinzufügen eines Elements zu HashSet- set.add(„map“); intern übersetzt in map .put(„SETZEN“, GEGENWART); und dann zur Backing HashMap Instanz hinzugefügt.

Eine Sache, die hier zu beachten ist, ist, dass der HashMap-Wert möglicherweise doppelt ist, der Schlüssel jedoch eindeutig sein sollte. Auf diese Weise stellt HashSet sicher, dass nur eindeutige Werte darin gespeichert werden, da der Wert, der im HashSet gespeichert werden soll, beim Speichern in HashMap zum Schlüssel wird.

Wie Element entfernt wird – HashSet interne Implementierung

Wenn wir ein Element aus dem HashSet entfernen müssen, intern wieder remove Methode von HashSetcalls remove(Object key) Methode der HashMap.

So wird es in der HashSet-Klasse implementiert.

public boolean remove(Object o) { return map.remove(o)==PRESENT;}

Beachten Sie hier, dass die Methode remove(Object key) der HashMap den mit dem Schlüssel verknüpften Wert zurückgibt.Während die remove(Object o) Methode des HashSet booleschen Wert zurückgibt. Wir wissen auch, dass für jeden in HashSet hinzugefügten Wert intern, wenn er der zugehörigen HashMap hinzugefügt wird, der Wert zum Schlüssel wird und der Wert immer ein Objekt namens PRESENT . Daher ist der Wert, der von der Methode remove(Object key) der HashMap zurückgegeben wird, immer in der Bedingungszuordnung vorhanden.entfernen (o) == VORHANDEN.

Wie Elemente aus HashSet in Java abgerufen werden

In HashSet gibt es keine get-Methode, wie in Map oder List angegeben. In HashSet gibt es einen Iterator, der die Werte des Sets durchläuft. Intern wird das Keyset der HashMap aufgerufen, da Werte als keysin der HashMap gespeichert werden, sodass wir die im HashSet gespeicherten Werte erhalten.

So wird Iterator intern im HashSet in Java implementiert.

/*** 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();}

Punkte zu beachten

  1. Im Gegensatz zu HashMap wo Hash-Funktion mit Schlüssel berechnet wird HashSet verwendet den Wert selbst, um die Hash-Funktion zu berechnen.
  2. Da die Hash-Funktion mit dem Wert berechnet wird, werden im HashSet nur eindeutige Werte gespeichert.
  3. HashSet verwendet intern HashMap , um seine Elemente zu speichern.
  4. Wenn ein Element mit der add(E e) -Methode zu HashSet hinzugefügt wird, ruft HashSet intern die put() -Methode der HashMap auf, wobei der in der add-Methode übergebene Wert zum Schlüssel in der put() -Methode wird. Ein Dummy-Wert „PRESENT“ wird als Wert in der put() -Methode übergeben.

Empfehlungen zum Lernen (Udemy-Kurse)

  1. Java Programming Masterclass Kurs
  2. Java In-Depth: Werden Sie ein kompletter Java Engineer!
  3. Spring Framework Master Class Kurs
  4. Kompletter Python Bootcamp Kurs
  5. Python für Data Science und maschinelles Lernen

Das ist alles für dieses Thema Wie HashSet intern in Java funktioniert. Wenn Sie Zweifel oder Vorschläge haben, hinterlassen Sie bitte einen Kommentar. Vielen Dank!

Verwandte Themen

  1. Wie ArrayList intern in Java funktioniert
  2. Wie HashMap intern in Java funktioniert
  3. Wie LinkedList Klasse intern in Java funktioniert
  4. LinkedHashSet in Java mit Beispielen
  5. TreeSet in Java mit Beispielen

Sie können auch mögen-

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.