Ausgabe ist:
%Vor%Wie verhält sich diese "get" -Methode? Da sowohl m1 als auch M2 dieselben Werte haben und ich hashcode () nicht überschrieben habe, wird die Methode equals () der Object-Klasse aufgerufen?
Stimmt das?
Wenn die Methoden hashCode()
und equals(Object o)
nicht von Ihrer Klasse überschrieben werden, verwendet Java nur den tatsächlichen Verweis auf das Objekt im Speicher, um die Werte zu berechnen (dh prüfen, ob es sich um die gleiche Instanz der Klasse handelt). Deshalb erhalten Sie immer noch beide Ergebnisse.
Alle Objekte haben hashCode () und equals (). Wenn sie nicht überschrieben werden, werden die Standardimplementierungen verwendet. Das Standardverhalten besteht darin, alle Objekte als unterschiedlich zu behandeln, sofern sie nicht dasselbe Objekt sind.
Zum Vergleich: Die IdentityHashMap tut dies immer, auch wenn Sie Ihren HashCode und equals überschrieben haben.
Es wird die equals- und hashcode-Methode der Objektklasse verwenden, um den Wert zu finden (da Contact keine Gleichheits- und Hashcode-Methoden übersteuert), also ja.
Ja, das ist richtig. Jedes Java-Objekt, das seine eigenen equals- und hashcode-Methoden nicht definiert, erbt die Standardmethoden equals und hascode für java.lang.Object. Diese Standardimplementierung basiert auf der Objektreferenzgleichheit und nicht auf der logischen Gleichheit. Da Sie get mit der gleichen Objektreferenz aufgerufen haben, kann das Objekt von der Map zurückgegeben werden.
Hier ist ein Beispiel, das dies weiter verdeutlicht.
%Vor%Obwohl m1 und m2 die gleichen Werte haben, sind sie unterschiedliche Objektreferenzen.
Das ist richtig: Da es keine Hashcode-Methode gibt, kann die JVM nicht erkennen, ob die Objekte m1 und m2 unterschiedliche Werte enthalten - & gt; Daher verwendet es die Methode hasCode () der Object-Klasse, um den hashCode-Wert zur Ausführung von get () zu berechnen, die verschiedene Hash-Werte zurückgibt (offensichtlich).
der zweite Punkt ist auch richtig: Da Sie Ihr eigenes equals () nicht implementiert haben, wird das Objekt equals () berücksichtigt, das nur dann true zurückgibt, wenn ein Objekt mit sich selbst verglichen wird.
Hier in Contact
class haben Sie die Funktionen hashcode()
und equals()
nicht implementiert.
Wenn HashMap diese Methode aufruft, sucht es nach dieser Methode in der Elternklasse, die in diesem Fall Objekt ist.
In diesem Fall wird der Objektort auf dem Heap anstelle der Werte ausgewertet.
z.B. Für zwei Objekte o1
und o2
o1.equals(o2) == true
nur bei o1 == o2
hashCode()
ist eine Methode der Objektklasse. Hash-Code ist eine Ganzzahldarstellung eines Objekts durch JVM. Hash-Code wird systemgeneriert und JVM nimmt die Adresse des Objekts als Basis (Seed), um den Hash-Code zu generieren. Hash-Codes müssen für verschiedene Ausführungszeiten nicht identisch sein.
Die Object-Klasse überschreibt standardmäßig die Methode hashCode und equals. Dies ist der Grund, warum Sie die gewünschte Ausgabe erhalten.
Wenn Sie die Methode "equals" und "hashcode" nicht überschreiben, prüft JVM sie hinter der Szene. Da m1 und m2 beide verschiedene Objektinstanzen sind, gibt die Methode equals immer false zurück. das heißt:
1. Für Gleichgestellte:
m1.equals (m2) // gibt false zurück, weil beide verschiedene Instanzen sind.
2. Für hashCode: // Siehe den Quellcode in HashMap.java
HashMap verwendet intern den Schlüssel erneut, bevor er hashMap einfügt. Siehe unten.
%Vor%für die Wiederaufbereitung hat hashMap eine eigene statische Hash-Methode:
%Vor%Intern funktionieren sowohl die equals- als auch die hashCode-Methode auf diese Weise, deshalb erhalten Sie beide Werte in der HashMap.
Hoffe das hilft:)
Tags und Links java