Sobes.tech
Middle

Prečo sa prepisujú metódy hashCode a operátor ==?

sobes.tech AI

Odpoveď od AI

Prepisovanje hashCode in operatorja == (za primerjavo objektov po vrednosti, ne po referenci) je nujno za pravilno delovanje kolekcij, ki temeljijo na hashu, kot sta HashSet in HashMap.

  • Operator == : Določa, kdaj se dva objekta štejejo za enaka. Privzeto primerja reference na objekte. Prepisom implementiramo logiko primerjave po vsebini ali atributih objekta.
  • Metoda hashCode : Vrne celo število (hash kodo) za objekt. Če sta dva objekta enaka po ==, morata imeti hashCode enaka. Obratno ni nujno, (dva objekta lahko imata enak hashCode, a nista enaka).

Nepostivanje tega pogodbe (enaki objekti z različnimi hashCode) vodi do nepravilnega delovanja hash kolekcij: elementi se lahko večkrat dodajo tam, kjer se pričakuje unikatnost (HashSet), ali pa jih ni mogoče najti (HashMap).

Primer:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Preveri, ali je other tipa Person
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Primerja atribute
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Ustvari hash iz atributov
}

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

  print(p1 == p2); // true (primerjava po vrednosti po prepisu)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (iskanje po hash in primerjavi)
}