Sobes.tech
Middle

Warum werden die Methoden hashCode und der Vergleichsoperator == überschrieben?

sobes.tech KI

Antwort von AI

Das Überschreiben von hashCode und des Operators == (zum Vergleich von Objekten anhand ihres Werts anstelle ihrer Referenz) ist notwendig für das korrekte Funktionieren von hashbasierten Sammlungen wie HashSet und HashMap.

  • Operator == : Bestimmt, wann zwei Objekte als gleich gelten. Standardmäßig vergleicht er die Referenzen der Objekte. Durch Überschreiben implementieren wir die Vergleichslogik anhand des Inhalts oder der Attribute des Objekts.
  • Methode hashCode : Gibt einen ganzzahligen Wert (Hash-Code) für das Objekt zurück. Wenn zwei Objekte gemäß == gleich sind, sollten ihre hashCode-Werte gleich sein. Das Gegenteil ist nicht wahr (zwei Objekte können den gleichen hashCode haben, aber ungleich sein).

Die Verletzung dieses Vertrags (gleichwertige Objekte mit unterschiedlichen hashCode) führt zu fehlerhaftem Verhalten hashbasierter Sammlungen: Elemente können mehrfach hinzugefügt werden, wo Einzigartigkeit erwartet wird (HashSet), oder sie können nicht gefunden werden (HashMap).

Beispiel:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Prüft, ob other eine Person ist
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Vergleicht Attribute
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Erzeugt Hash aus Attributen
}

void main() {
  final p1 = Person('Alice', 30);
  final p2 = Person('Alice', 30);
  final p3 = Person('Bob', 25);

  print(p1 == p2); // true (Wertvergleich nach Überschreibung)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (Suche anhand Hash und Vergleich)
}