Sobes.tech
Middle

Kāpēc tiek pārrakstītas hashCode metodes un salīdzināšanas operators ==?

sobes.tech AI

Atbilde no AI

Pārdefinēt hashCode un operatoru == (lai salīdzinātu objektus pēc vērtības, nevis pēc atsauces) ir nepieciešams, lai pareizi darbotos heshēšanas kolekcijas, piemēram, HashSet un HashMap.

  • Operators ==: Nosaka, kad divi objekti tiek uzskatīti par vienādiem. Pēc noklusējuma tas salīdzina atsauces uz objektu. Pārdefinējot to, mēs īstenojam loģiku, kā salīdzināt objekta saturu vai atribūtus.
  • Metode hashCode: Atgriež veselā skaitļa vērtību (hesh kodu) objektam. Ja divi objekti ir vienādi pēc operatora ==, to hesh kodi jābūt vienādiem. Atgrieztais ir nepareizi, ja divi objekti var būt ar vienādiem hesh kodiem, bet nav vienādi.

Šī kontrakta pārkāpšana (vienādi objekti ar dažādiem hesh kodiem) noved pie nepareizas heshēto kolekciju darbības: elementi var tikt pievienoti vairākas reizes tur, kur tiek gaidīta unikālitāte (HashSet), vai arī tos nevar atrast (HashMap).

Piemērs:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Pārbaudām, vai other ir Person
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Salīdzinām atribūtus
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Ģenerē hesh no atribūtiem
}

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

  print(p1 == p2); // true (salīdzināšana pēc vērtības pēc pārdefinēšanas)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (meklēšana pēc hesh un salīdzināšanas)
}