Sobes.tech
Junior — Middle

Warum ist es notwendig, die Methoden hashCode und equals zu überschreiben, wenn gleiche Objekte zu einem HashSet hinzugefügt werden?

sobes.tech KI

Antwort von AI

HashSet in Java verwendet eine Hashtabelle zur Speicherung von Elementen. Um korrekt zu bestimmen, ob zwei Objekte gleich sind und Duplikate zu vermeiden, stützt sich HashSet auf die Methoden hashCode() und equals().

  • Die Methode hashCode() berechnet den Hash-Code des Objekts, der bestimmt, in welche "Korb" (Bucket) in der Hashtabelle es einsortiert wird.
  • Die Methode equals() vergleicht zwei Objekte auf Gleichheit.

Wenn du diese Methoden in deiner Klasse nicht überschreibst, wird die Implementierung aus der Klasse Object verwendet, die Objekte anhand ihrer Referenz vergleicht (d.h., zwei verschiedene Objekte mit denselben Daten werden als unterschiedlich betrachtet).

Daher ist es notwendig, hashCode() und equals() so zu überschreiben, dass sie die bedeutenden Felder des Objekts berücksichtigen, damit HashSet korrekt gleiche Objekte erkennt und keine Duplikate zulässt.

Beispiel:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyClass myClass = (MyClass) o;
    return field1.equals(myClass.field1) && field2.equals(myClass.field2);
}

@Override
public int hashCode() {
    return Objects.hash(field1, field2);
}

Ohne dies kann HashSet mehrere Objekte mit denselben Daten speichern, was die Logik der Menge verletzt.