Sobes.tech
Middle

Niyə hashCode metodları və == müqayisə operatoru yenidən təyin olunur?

sobes.tech Süni İntellekt

AI-dan cavab

hashCode== operatorunun yenidən tərtib olunması (obyektləri dəyərinə görə, yoxsa referansa görə müqayisə etmək üçün) HashSetHashMap 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ın hashCode-ları eyni olmalıdır. Əks halda, iki obyekt eyni hashCode-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ış)
}