Middle
Niyə hashCode metodları və == müqayisə operatoru yenidən təyin olunur?
sobes.tech Süni İntellekt
AI-dan cavab
hashCode və == operatorunun yenidən tərtib olunması (obyektləri dəyərinə görə, yoxsa referansa görə müqayisə etmək üçün) HashSet və HashMap kimi hash əsaslı kolleksiyaların düzgün işləməsi üçün vacibdir.
- Operator
==: İki obyektin bərabər sayılması üçün şərtləri müəyyən edir. Əsasən, obyektlərin referanslarını müqayisə edir. Yenidən tərtib etdikdə, obyektin məzmunu və ya atributları əsasında müqayisə loqikasını həyata keçiririk. - Metod
hashCode: Obyekt üçün tam ədəd dəyər (hash kodu) qaytarır. Əgər iki obyekt==ilə bərabərdirsə, onlarınhashCode-ları eyni olmalıdır. Əks halda, iki obyekt eynihashCode-a sahib ola bilər, amma bərabər olmaya da bilər.
Bu müqavilənin pozulması (bərabər obyektlərin fərqli hashCode-a malik olması) hash əsaslı kolleksiyaların düzgün işləməməsinə səbəb olur: elementlər çox dəfə əlavə oluna bilər (HashSetdə), və ya tapılmaya bilər (HashMapdə).
Nümunə:
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
bool operator ==(Object other) {
// other obyektinin Person olub olmadığını yoxlayır
if (identical(this, other)) return true;
if (other.runtimeType != runtimeType) return false;
// atributları müqayisə edir
return other is Person && name == other.name && age == other.age;
}
@override
int get hashCode => Object.hash(name, age); // atributlardan hash yaradır
}
void main() {
final p1 = Person('Alice', 30);
final p2 = Person('Alice', 30);
final p3 = Person('Bob', 25);
print(p1 == p2); // true (dəyər əsasında müqayisə, yenidən tərtibdən sonra)
print(p1 == p3); // false
final peopleSet = {p1};
print(peopleSet.contains(p2)); // true (hash və müqayisə ilə axtarış)
}