Hashcode und equals

8

equals und hashCode müssen konsistent sein, was bedeutet, dass, wenn zwei Objekte nach equals method gleich sind, ihre hashCode Methode denselben Hashwert zurückgeben soll.

Java gibt einen eindeutigen Hashcode zurück, wenn wir die Methode hashCode () nicht überschreiben.

%Vor%

Warum führt das Auskommentieren der Zeile zu einem Kompilierungsfehler?

Wenn die Objekte ungleiche Hash-Codes haben, warum werden sie gleich angezeigt, obwohl der Standard-Hash-Code variiert?

    
Nitish Upreti 02.01.2010, 05:55
quelle

7 Antworten

6

Die Gleichheit wird nur durch die Methode equals () bestimmt. Und die Methode hashCode () wird in anderen Situationen verwendet, etwa nach Map oder Set. Es ist etwas wie eine Vorbedingung oder ein Hinweis, bevor tatsächlich gleich heißt (für Effizienz). Daher wird angenommen, dass wenn 2 Objekte gleich sind (das heißt, equals () gibt true zurück), dann muss ihre hashCodes () den gleichen Wert zurückgeben.

In Ihrem Code sind also 2 Objekte gleich, solange Ihr überschriebenes equals () true zurückgibt, egal was hashCode () tut. hashCode () wird beim Vergleich auf Gleichheit überhaupt nicht aufgerufen.

Diese Frage enthält ausführlichere Informationen zu zu der Beziehung zwischen equals () und hashCode ().

    
bryantsai 02.01.2010, 06:34
quelle
6

Zuerst müssen Sie in dieser Zeile Hashvalue in HashValue ändern, da Ihre Klasse eigentlich HashValue heißt.

Wenn Sie die Zeile auskommentieren, erhalten Sie Folgendes:

%Vor%

Es gibt ein paar Dinge falsch damit:

  1. Dies wird nicht kompiliert, da hh nicht im Gültigkeitsbereich ist, wenn Sie es verwenden.

  2. Die erste if-Anweisung sollte entweder sicherstellen, dass die Funktion überhaupt nicht ausgeführt wird, wenn Sie zwei Dinge vergleichen, die nicht HashValues ​​sind (dh eine Ausnahme auslösen), oder false zurückgeben, weil HashValues ​​sind niemals gleich anderen Arten von Objekten. Ich bevorzuge es generell, false zurückzugeben, um eine Ausnahme auszulösen.

  3. Die zweite if-Anweisung ist redundant, weil Sie nur das Ergebnis der Bedingung zurückgeben.

Überarbeiten Sie Ihre Methode wie folgt:

%Vor%

Das ist auch nicht ganz richtig. Um sicherzustellen, dass alle gleichen Objekte denselben Hash-Code haben, müssen Sie hashCode() in HashValue und Sie muss sicherstellen, dass es der Garantie entspricht. Hier könnten Sie einfach Folgendes hinzufügen:

%Vor%

Die Implementierung ist trivial, weil Ihr Objekt nur ein Wrapper um ein int ist. Sie müssen darüber nachdenken, wie Ihre Objekte ausgefeilter werden.

    
tgamblin 02.01.2010 05:58
quelle
1

Für den Anfang müssen Sie das v in "Hashvalue"

groß schreiben %Vor%

sollte

sein %Vor%     
Peter Recore 02.01.2010 05:57
quelle
1

HashValue und Hashwert sind zwei verschiedene Bezeichner

if(oo instanceof HashValue) funktioniert, weil Ihr Klassenname HashValue nicht Hashvalue

lautet

BEARBEITEN:

Ihr Code funktioniert nicht, da hh nicht im Gültigkeitsbereich ist, wenn Sie ihn verwenden.

Das funktioniert:

%Vor%     
Prasoon Saurav 02.01.2010 05:59
quelle
1

Wie andere schon darauf hingewiesen haben, dienen die Methoden "equals" und der "hashCode" unterschiedlichen Zwecken.

Aus der Spezifikation von hashCode Methode in Object kann man folgern:

  • Es ist erforderlich , dass zwei gleiche Objekte das gleiche Integer-Ergebnis zurückgeben sollen, wenn die hashCode-Methode für sie aufgerufen wird
  • Es wird dringend empfohlen, dass ungleiche Objekte ganzzahlige Werte zurückgeben

Ihr Code (unter Berücksichtigung der Änderung, die vorgeschlagen wurde) erfüllt die Kriterien (a), daher erhalten Sie die Ausgabe als "EQUALS".

Es ist jedoch eine gute Übung, (b) zu folgen, da dies zu einer besseren Leistung führt, wenn die Instanz der Klasse als Hashtable-Schlüssel verwendet wird. Wenn ungleiche Objekte denselben hashCode zurückgeben und wenn eine solche Klasse als Hashtable-Schlüssel verwendet wird, dann wird jedes Objekt in denselben Bucket geschrieben, und die Hashtabelle würde zu einer verketteten Liste degenerieren, was zu einer reduzierten Leistung führt.

    
sateesh 02.01.2010 08:09
quelle
0

Im folgenden Code:

%Vor%

Es gibt ein paar Probleme: 1. Hashvalue wird von Ihrem Compiler nicht erkannt. Es sollte "HashValue" sein 2. hh ist außerhalb des Bereichs, wenn es aus dem if-Block herauskommt. Daher Compilerfehler.

Sie können Ihr Programm zu folgenden ändern und es wird funktionieren:

%Vor%

oder Sie können es wie folgt präziser machen:

%Vor%     
ankit3j 23.06.2017 08:40
quelle
-1
%Vor%     
mario 28.08.2010 05:08
quelle

Tags und Links