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 ihrehashCode-Werte gleich sein. Das Gegenteil ist nicht wahr (zwei Objekte können den gleichenhashCodehaben, 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)
}