Sobes.tech
Middle

Miks üle kirjutatakse hashCode meetod ja võrdlusoperaator ==?

sobes.tech AI

Vastus AI-lt

Ümbermäärake hashCode ja operaator == (objektide võrdlemiseks väärtuse järgi, mitte viite järgi) on vajalik, et hash-põhised kogud, nagu HashSet ja HashMap, töötaksid korrektselt.

  • Operaator ==: Määrab, millal kaks objekti loetakse võrdseteks. Vaikimisi võrdleb see viiteid objektidele. Ümbermäärates selle, rakendame loogika, kuidas võrrelda objekti sisu või atribuute.
  • Meetod hashCode: Tagastab täisarvu (hash-koodi) objekti kohta. Kui kaks objekti on võrdsed == operaatori järgi, peavad nende hash-koodid olema samad. Vastupidine ei kehti (kaks objekti võivad omada sama hash-koodi, kuid olla mitte-võrdsed).

Selle kontakti rikkumine (võrdsed objektid erinevate hash-koodidega) põhjustab hash-põhiste kogude ebaõiget tööd: elemendid võivad olla lisatud mitu korda sinna, kus eeldatakse unikaalsust (HashSet), või neid ei leia üldse (HashMap).

Näide:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Kontrollime, kas other on Person
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Võrdleme atribuute
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Hesh genereeritakse atribuutidest
}

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

  print(p1 == p2); // true (väärtuse võrdlus pärast ümbermääramist)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (otsing hesh ja võrdluse järgi)
}