Middle
Zašto se prepisuju metode hashCode i operator poređenja ==?
sobes.tech АИ
Одговор од АИ
Prepisivanje hashCode i operatora == (za poređenje objekata po vrednosti, a ne po referenci) je neophodno za ispravno funkcionisanje kolekcija zasnovanih na heširanju, kao što su HashSet i HashMap.
- Operator
==: Određuje kada se dva objekta smatraju jednakim. Po podrazumevanom, poredi reference objekata. Prepisivanjem, implementiramo logiku poređenja po sadržaju ili atributima objekta. - Metod
hashCode: Vraća celobrojnu vrednost (hash kod) za objekat. Ako su dva objekta jednaka prema==, njihovihashCodetrebaju biti isti. Obrnuto nije nužno, (dva objekta mogu imati istihashCode, ali biti različiti).
Nepostivanje ovog ugovora (jednaki objekti sa različitim hashCode) dovodi do neispravnog rada hash kolekcija: elementi mogu biti dodavani više puta tamo gde se očekuje jedinstvenost (HashSet), ili ne mogu biti pronađeni (HashMap).
Primer:
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
bool operator ==(Object other) {
// Proverava da li je other Person
if (identical(this, other)) return true;
if (other.runtimeType != runtimeType) return false;
// Upoređuje atribute
return other is Person && name == other.name && age == other.age;
}
@override
int get hashCode => Object.hash(name, age); // Generiše hash od atributa
}
void main() {
final p1 = Person('Alice', 30);
final p2 = Person('Alice', 30);
final p3 = Person('Bob', 25);
print(p1 == p2); // true (poređenje po vrednosti nakon prepisivanja)
print(p1 == p3); // false
final peopleSet = {p1};
print(peopleSet.contains(p2)); // true (pretraga po hash i poređenju)
}