Wenn mich jemand den Arbeitsmechanismus der Hash -Karte beschreiben lässt, werde ich einfach antworten: "Hash -basierte Regeln". Dieser Satz ist sehr einfach, aber bevor wir diesen Satz verstehen, müssen wir zuerst verstehen, was IH, nicht wahr?
Was ist ein Namen?
Hash ist einfach eine eindeutige Zeichenfolge, die nach dem Attribut der Variablen/Objekt auf einen bestimmten Algorithmus angewendet wird, und diese Zeichenfolge wird verwendet, um die Einzigartigkeit der Variablen/des Objekts zu bestimmen. Eine korrekte Hash -Funktion muss dieses Kriterium einhalten.
Wenn die Hash -Funktion auf dasselbe Objekt oder ein gleiches Objekt angewendet wird, sollte jede Ausführung denselben Wert zurückgeben. Mit anderen Worten, zwei gleiche Objekte sollten denselben Hashcode haben.
Hinweis: Alle Java -Objekte erben eine Standard -HashCode () -Methode aus der Objektklasse. Diese Methode gibt die Adresse des Objekts als Ganzzahl zurück.
Eine Einführung in die Eingangsklasse
Die Definition einer Karte lautet: ein Objekt von einem Zuordnungsschlüssel zum Wert. Sehr einfach, oder?
Daher muss es in HashMap einen bestimmten Mechanismus geben, um diese wichtigen Wertepaare zu speichern. Make HashMap hat einen internen Klasseneintrag, der so aussieht.
Statische Klasseneingabe <k, v> implementiert MAP.Entry <K, v> {endgültiger Key;
Natürlich hat die Eintragsklasse Attribute, um Schlüsselwerte zu speichern. Der Schlüssel wird durch endgültig gekennzeichnet. Als nächstes versuchen wir, die Bedeutung dieser Variablen zu verstehen.
Was macht die Put () -Methode tatsächlich?
Bevor Sie sich die Implementierung der Put -Methode ansehen, müssen Sie sich die Speicherung der Eintragsinstanz im Array ansehen.
/ ** * Die Tabelle, die Größe der Größe ist, muss immer eine Leistung von zwei sein. /*** assoziiert den angegebenen Wert mit dem angegebenen Schlüssel in dieser Karte.* Wenn die Karte zuvor für den Schlüssel enthält, wird der alte Wert ced. Wertwert, der dem Schlüssel angeben* @return den vorherigen Wert zugeordnet ist, der mit </tt> zugeordnet ist, oder* <tt> null </tt> wenn theer e /tt>.* (a <tt> null </tt> Rückgabe kann auch angeben, dass die Karte* zuvor Assoziation <Tt> null </tt> Schlüssel </tt>.)*/Public v put (k key, value) {if (key == null) return putvorullKey (Wert); int Hash = HABE (KEY.HashCode ()); && (K = E.Key) == Key || , Schlüssel, alle);
Lassen Sie uns Schritt für Schritt beobachten
Überprüfen Sie zunächst, ob der Schlüssel null ist.
Als nächstes wird der Hash -Wert dieses Schlüssels über die Schlüssel -HashCode () -Methode () berechnet, mit der die Position im Array des Eingabefiels berechnet wird. Der Designer von JDK geht davon aus, dass einige Menschen möglicherweise sehr schlechte Hashcode () -Methoden schreiben, und es werden einige sehr große oder sehr kleine Hash -Werte geben. Um dieses Problem zu lösen, führten sie eine andere Hash -Funktion ein, um den HashCode () des Objekts zu akzeptieren und sie in die Kapazität des Arrays umzuwandeln.
Als nächstes kommt die Indexfor (Hash, Tabelle, Länge) Methode, mit der die genaue Position des Speicher des Eintragsobjekts berechnet wird.
Als nächstes wissen wir alle, dass zwei verschiedene Objekte den gleichen Hashcode -Wert haben können.
Die Antwort lautet LinkedList. Wenn Sie sich erinnern, hat die Eingangsklasse eine nächste Variable, diese Variable weist immer auf die nächste Variable in der Kette hin, die die Eigenschaften der verknüpften Liste vollständig erfüllt.
Wenn eine Kollision auftritt, wird das Eintragsobjekt in Form einer verknüpften Liste gespeichert. Das aktuelle Einstiegsobjekt wird als nächster Knoten des gespeicherten Eintragsobjekts verwendet.
Was ist, wenn wir den vorhandenen Schlüssel in einem anderen Wert speichern? Logischerweise wird der alte Wert ersetzt. Nach der Erkennung der Speicherposition des Eintragsobjekts durchquert HashMap die gelinkte Eintragsliste in dieser Position. Wenn Sie feststellen, dass die Equals -Methode gleich ist, wird der Ersatz durchgeführt.
Auf diese Weise kann HashMap die Einzigartigkeit des Schlüssels sicherstellen.
Der Arbeitsmechanismus der Get -Methode
Jetzt haben wir den Mechanismus des Speichers in HashMap gelernt. Die nächste Frage ist: Wie man die Ergebnisse aus einem HashMap abfragt.
Tatsächlich ist die Logik dieselbe wie die Put.
/*** Gibt den Wert zurück, an den die Taste angeben,* oder {@code null}, wenn diese Karte keine Zuordnung für den Schlüssel enthält. * {@code k} zu einem Wert {@code v}, so dass {@code (key == null? k == null:* key.equals (k)}, dann gibt diese Methode {@code v}; o zurück zurück theerzgewaltig* retektiert {@code null}. verwendet, um die beiden Fälle zu unterscheiden. )); = Schlüssel ||.
Der obige Code ähnelt der Put () -Methode, außer wenn (e.hash == Hash && ((k = E.Key) == Key || key.equals (k))).
Passt auf