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