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?
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 ().
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:
Dies wird nicht kompiliert, da hh
nicht im Gültigkeitsbereich ist, wenn Sie es verwenden.
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.
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:
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.
Für den Anfang müssen Sie das v in "Hashvalue"
groß schreiben %Vor%sollte
sein %Vor%HashValue und Hashwert sind zwei verschiedene Bezeichner
if(oo instanceof HashValue)
funktioniert, weil Ihr Klassenname HashValue
nicht Hashvalue
BEARBEITEN:
Ihr Code funktioniert nicht, da hh
nicht im Gültigkeitsbereich ist, wenn Sie ihn verwenden.
Das funktioniert:
%Vor%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:
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.
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%