Objekte als Map-Schlüssel ohne Hashcode und equals

8
%Vor%

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?

  1. Es gibt keine Hashcode-Methode, daher kann die JVM nicht sehen, ob die Objekte m1 und m2 andere Werte enthalten
  2. Es gibt keine equals-Methode, die überschrieben wird, daher wird das Objekt equals () aufgerufen, und da beide Objekte unterschiedlich sind, funktioniert der obige Code einwandfrei, ohne dass m2 den Wert von m1 ersetzt.
Ved 29.07.2011, 10:43
quelle

7 Antworten

8

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.

    
Nico Huysamen 29.07.2011, 10:48
quelle
3

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.

    
Peter Lawrey 29.07.2011 11:16
quelle
2

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.

  1. Ja, Java wird immer sehen, dass zwei Kontaktobjekte unterschiedlich sind, da es die Objektreferenz zum Vergleichen verwendet, wenn es die Methode equals im Objekt
  2. verwendet
  3. Ja, da zwei Kontaktobjekte Referenzen haben.
Low Flying Pelican 29.07.2011 10:59
quelle
0

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%     
mR_fr0g 29.07.2011 10:48
quelle
0

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.

    
Swagatika 29.07.2011 10:54
quelle
0

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.

    
Talha Ahmed Khan 29.07.2011 10:47
quelle
0

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:)

    
Sanchit 01.04.2017 19:04
quelle

Tags und Links