Überschreiben der Hashcode-Funktion in Java
hashcode
in Java ist eine Funktion, die den Hash-Algorithmus verwendet und einen ganzzahligen Wert zurückgibt, der ein Objekt darstellt. hashcode()
ist ein Teil der Object
-Klasse, was bedeutet, dass diese Funktion für jede Klasse verfügbar ist, die die Object
-Klasse erbt.
Dieser Artikel zeigt, wie wir die Methode hashcode()
überschreiben können, um unsere Implementierung bereitzustellen.
Warum überschreiben wir die hashcode()
-Methode
Bevor wir mit dem Überschreiben der Funktion hashcode()
fortfahren, sollten wir verstehen, warum wir diese Methode überschreiben müssen. Wichtig zu beachten ist, dass die Methoden equals()
und hashcode()
zusammengehören und es im Allgemeinen obligatorisch ist, die Methode hashcode()
zu überschreiben, wenn die Funktion equals()
überschrieben wird. Das liegt daran, dass hashcode()
besagt, dass, wenn die Objekte gleich sind, auch ihre Hash-Codes gleich sein müssen.
Um das Motiv hinter dem Überschreiben der Methode hashcode()
praktisch zu verstehen, erstellen wir ein Beispiel mit zwei Klassen namens HashCodeExample
und DummyClass
. In DummyClass
stellen wir einen einfachen Konstruktor zur Verfügung, der die Variable abc
setzt. Jetzt erstellen wir in der Klasse HashCodeExample
zwei Instanzen der Klasse DummyClass
und benennen sie als dummyClass1
und dummyclass2
mit demselben Wert in ihren Konstruktoren.
Wir vergleichen die beiden Instanzen mit der Methode equals()
, aber die Ausgabe zeigt, dass sie nicht gleich sind.
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
System.out.println(dummyClass1.equals(dummyClass2));
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
}
Ausgabe:
false
Dies geschieht, weil jede Objektinstanz in Java einen eindeutigen Hash-Code erhält, den wir überprüfen können, indem wir die Methode hashCode()
für beide Objekte aufrufen. Die Ausgabe zeigt, dass die ganzzahligen Werte beider Objekte unterschiedlich sind.
System.out.println(dummyClass1.hashCode());
System.out.println(dummyClass2.hashCode());
Ausgabe:
2065951873
1791741888
Um das Problem ungleicher Objekte zu beheben, können wir die Funktion equals()
überschreiben und unsere Implementierung verwenden. Der folgende Code ist derselbe wie im ersten Programm, aber wir überschreiben die equals()
-Methode, die ein Object
als Argument nimmt und einen boolean
zurückgibt.
In der Funktion equals()
wandeln wir den Parameter o
vom Typ Object
in den Typ von DummyClass
um, der eine Instanz von DummyClass
zurückgibt. Nun vergleichen wir die Variable abc
der Klasse DummyClass
mit der Objektvariablen abc
, die in der Methode als Argument übergeben wird.
Die Ausgabe zeigt, dass das Ergebnis von dummyClass1.equals(dummyClass2)
als true
kommt, da wir die Standardimplementierung so geändert haben, dass sie true zurückgibt, wenn die Werte der Instanzen gleich sind.
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
System.out.println(dummyClass1.equals(dummyClass2));
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
@Override
public boolean equals(Object o) {
DummyClass dummyClassObj = (DummyClass) o;
return this.abc == dummyClassObj.abc;
}
}
Ausgabe:
true
Die obige Lösung funktioniert nur, wenn wir die Werte und nicht die Hash-Codes vergleichen, da die Hash-Codes der beiden Objekte dummyClass1
und dummyClass2
immer noch unterschiedlich sind.
Zur besseren Veranschaulichung erstellen wir ein HashSet()
, das ein Objekt vom Typ Set<DummyClass>
zurückgibt, und fügen beide DummyClass
-Objekte mit der Funktion add()
hinzu. Nun drucken wir das Set
und erhalten zwei Objekte mit unterschiedlichen Referenzen in der Ausgabe, was beweist, dass die DummyClass
-Objekte unterschiedliche Hash-Codes haben.
Hier überschreiben wir die Funktion hashcode()
, um das Problem zu beheben, das wir im nächsten Beispiel unten sehen werden.
import java.util.HashSet;
import java.util.Set;
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
Set<DummyClass> dummyClassSet = new HashSet<>();
dummyClassSet.add(dummyClass1);
dummyClassSet.add(dummyClass2);
System.out.println(dummyClassSet);
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
@Override
public boolean equals(Object o) {
DummyClass dummyClass = (DummyClass) o;
return this.abc == dummyClass.abc;
}
}
Ausgabe:
[DummyClass@7b23ec81, DummyClass@6acbcfc0]
Überschreiben Sie die Methode hashcode()
in Java
Um unsere Implementierung in der Methode hashcode()
zu verwenden, überschreiben wir zuerst die Methode hashcode()
in der Klasse DummyClass
und geben den Wert der Variablen abc
der Klasse zurück. Nun wird der Hashcode durch den Wert abc
ersetzt. Wenn wir nun dummyClassSet
drucken, erhalten wir nur ein Objekt, weil der Hashcode oder die Referenz gleich ist.
import java.util.HashSet;
import java.util.Set;
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
Set<DummyClass> dummyClassSet = new HashSet<>();
dummyClassSet.add(dummyClass1);
dummyClassSet.add(dummyClass2);
System.out.println(dummyClassSet);
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
@Override
public boolean equals(Object o) {
DummyClass dummyClass = (DummyClass) o;
return this.abc == dummyClass.abc;
}
@Override
public int hashCode() {
return abc;
}
}
Ausgabe:
[DummyClass@a]
Wenn wir die Hash-Codes der beiden Objekte dummyClass1
und dummyClass2
drucken, erhalten wir die gleichen Hash-Codes.
System.out.println(dummyClass1.hashCode());
System.out.println(dummyClass2.hashCode());
Ausgabe:
10
10
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn