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)
}