verstehen
Der Zweck von HashCode () besteht darin, den Hash -Code zu erhalten, der auch als Hash -Code bekannt ist. Es gibt tatsächlich eine Int -Ganzzahl zurück. Die Funktion dieses Hash -Codes besteht darin, die Indexposition des Objekts in der Hash -Tabelle zu bestimmen.
HashCode () ist in JDKs Object.java definiert, was bedeutet, dass jede Klasse in Java die HashCode () -Funktion enthält.
Obwohl jede Java -Klasse eine HashCode () -Funktion enthält. Der HashCode () der Klasse ist jedoch nur beim Erstellen und Erstellen einer "Hash -Tabelle" (siehe Beschreibung der folgenden "Hash -Tabelle") (die Funktion besteht darin, die Position jedes Objekts der Klasse in der Hash -Tabelle zu bestimmen; in anderen Fällen (z.
Die obige Hash -Liste bezieht sich auf: Klassen in Java -Sammlungen, die im Wesentlichen Hash -Listen wie HashMap, Hashtable und Hashset sind.
Mit anderen Worten: Hashcode () ist nur in Hashlisten nützlich, aber in anderen Fällen nutzlos. Die Funktion von HashCode () in einer Hash -Tabelle besteht darin, den Hash -Code des Objekts zu erhalten und dann die Position des Objekts in der Hash -Tabelle zu bestimmen.
Wir alle wissen, dass in einer Hash-Tabelle Schlüsselwertpaare gespeichert sind, die durch: sie können die entsprechenden "Werte" basierend auf "Schlüssel" schnell abrufen. Dies verwendet Hash -Code!
Die Essenz einer Hash -Tabelle wird durch ein Array implementiert. Wenn wir in einer Hash -Tabelle einen bestimmten "Wert" erhalten möchten, möchten wir das Element tatsächlich an einer bestimmten Position im Array bringen. Die Position des Arrays wird durch "Schlüssel" erhalten; Darüber hinaus wird die Position des Arrays durch den Hash -Code berechnet, der dem "Schlüssel" entspricht.
Im Folgenden werden wir Hashset als Beispiel für die Tiefe der Rolle von HashCode () nennen.
Angenommen, es gibt bereits 1000 Elemente im Hashset. Was soll ich tun, wenn ich das 1001. Element einfügte? Da Hashset eine festgelegte Sammlung ist, ermöglicht es doppelte Elemente.
"Vergleichen Sie das 1001. Element eins nach dem anderen mit den vorherigen 1000 Elementen"? Offensichtlich ist diese Effizienz gleichermaßen ineffizient. Die Hash -Tabelle löst dieses Problem sehr gut. Es berechnet die Position des Elements in der Hash -Tabelle basierend auf dem Hash -Code und fügt dann das Element in diese Position ein. Für dasselbe Element wird natürlich nur einer gespeichert.
Daraus können wir sehen, dass, wenn zwei Elemente gleich sind, ihre Hash -Codes gleich sein müssen; Aber umgekehrt ist es nicht. In einer Hash -Tabelle,
1. Wenn zwei Objekte gleich sind, müssen ihre HashCode () -Werte gleich sein;
2. Wenn die beiden Objekte HashCode () gleich sind, sind sie nicht unbedingt gleich.
Hinweis: Dies ist in Hash -Tabellen der Fall. Dies muss in Nicht -Hash -Listen der Fall sein!
Beispiel
Schauen wir uns ein bestimmtes Beispiel an.
public class hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } public int HashCode () {return i % 10; } öffentliche endgültige statische void main (String [] args) {HashTest a = new HashTest (); Hashtest B = neuer Hashtest (); A.Seti (1); B.Seti (1); Set <HashTest> set = new Hashset <SehTest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Das Ergebnis dieser Ausgabe:
Richtig Falsch [com.ubs.sae.test.hashtest@1, com.ubs.sae.test.hashtest@1]
Im obigen Beispiel schreiben wir nur die HashCode -Methode neu. Aus den obigen Ergebnissen können wir erkennen, dass die Hashcodes der beiden Objekte, obwohl die beiden Objekte gleich sind, die Equals -Methode tatsächlich nicht gleich geschrieben haben, und dann werden wir die Standardmethode des Objekts aufrufen, um zu vergleichen, ob die beiden Objekte die beiden Objekte gleich sind, und es sind zwei verschiedene Objekte, und die Referenzen der beiden Objekte sind definitiv ungewiss. Hier setzen wir das generierte Objekt in das Hashset, und nur das eindeutige Objekt kann im Hashset gespeichert werden, dh dasselbe Objekt (anwendbar für die Equals -Methode) speichert nur einen.
Zu diesem Zeitpunkt fügen wir die Equals -Methode hinzu:
public class hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } <span style = "color:#3366ff;"> <strong> public boolean Equals (Objekt Objekt) {if (Object == null) {return false; } if (Object == this) {return true; } if (! (Objektinstanz von HashTest)) {return false; } Hashtest other = (HashTest) Objekt; if (other.geti () == this.geti ()) {return true; } return false; } </strong> </span> public int hashcode () {return i % 10; } öffentliche endgültige statische void main (String [] args) {HashTest a = new HashTest (); Hashtest B = neuer Hashtest (); A.Seti (1); B.Seti (1); Set <HashTest> set = new Hashset <SehTest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Die zu diesem Zeitpunkt erzielten Ergebnisse sind wie folgt:
true true [com.ubs.sae.test.hashtest@1]
Aus den Ergebnissen können wir sehen, dass die beiden Objekte jetzt völlig gleich sind und nur ein Objekt im Hashset gespeichert ist.
Zusammenfassen
1. Die Existenz von HashCode wird hauptsächlich zur Suche nach Fastness verwendet, wie z.
2. Wenn die beiden Objekte gleich sind, gilt es für die Methode der gleichen (java.lang.Object), dann müssen die Hashcodes dieser beiden Objekte gleich sein;
3. Wenn die Equals -Methode des Objekts neu geschrieben wird, sollte der HashCode des Objekts auch so weit wie möglich umgeschrieben werden, und das von Hashcode verwendete Objekt muss mit der gleichen Methode übereinstimmen, die ansonsten den oben genannten zweiten Punkt verletzt.
4. Der HashCode zweier Objekte ist gleich, was nicht unbedingt bedeutet, dass die beiden Objekte gleich sind, dh, gilt sie nicht unbedingt für die Methode der gleichen (java.lang.object). Es kann nur darauf hinweisen, dass sich diese beiden Objekte in einer Hash -Speicherstruktur befinden, wie z. B. Hashtable, und sie "im selben Korb gespeichert".