Sobes.tech
Middle

De ce sunt suprascrise metodele hashCode și operatorul de comparație ==?

sobes.tech AI

Răspuns de la AI

Rescrierea hashCode și a operatorului == (pentru compararea obiectelor după valoare, nu după referință) este necesară pentru funcționarea corectă a colecțiilor bazate pe hash, cum ar fi HashSet și HashMap.

  • Operatorul == : Definește când două obiecte sunt considerate egale. În mod implicit, compară referințele obiectelor. Prin rescriere, implementăm logica de comparare după conținut sau atribute ale obiectului.
  • Metoda hashCode : Returnează o valoare întreagă (cod hash) pentru obiect. Dacă două obiecte sunt egale conform ==, hashCode-urile lor trebuie să fie identice. Contrar, două obiecte pot avea același hashCode, dar să nu fie egale.

Nerespectarea acestui contract (obiecte egale cu hashCode diferit) duce la funcționarea incorectă a colecțiilor hash-uite: elementele pot fi adăugate de mai multe ori acolo unde se așteaptă unicitatea (HashSet), sau nu pot fi găsite (HashMap).

Exemplu:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Verifică dacă other este Person
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Compară atributele
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Generează hash din atribute
}

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

  print(p1 == p2); // true (comparare după valoare după rescriere)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (căutare după hash și comparare)
}