Überschreiben der Hashcode-Funktion in Java

Rupam Yadav 12 Oktober 2023
  1. Warum überschreiben wir die hashcode()-Methode
  2. Überschreiben Sie die Methode hashcode() in Java
Ü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 Yadav avatar Rupam Yadav avatar

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