Sobes.tech
Middle

Nima uchun hashCode metodlari va == taqqoslash operatori qayta yoziladi?

sobes.tech AI

AIdan javob

HashCode va == operatorini qayta yozish (obyektlarni qiymat bo‘yicha, havolalar emas, solishtirish uchun) HashSet va HashMap kabi xash asosidagi kolleksiyalarni to‘g‘ri ishlash uchun zarur.

  • == operatori: Ikki obyekt teng hisoblanishi uchun qanday shartlar bajarilishini belgilaydi. Standart holatda, u obyektlarning referenslarini solishtiradi. Uni qayta yozish bilan, obyektning mazmuni yoki atributlari bo‘yicha solishtirish logikasini amalga oshiramiz.
  • hashCode metodi: Obyekt uchun butun sonli qiymat (hash kod) qaytaradi. Agar ikki obyekt == bo‘yicha teng bo‘lsa, ularning hashCode bir xil bo‘lishi kerak. Aks holda, ikki obyekt bir xil hashCodega ega bo‘lishi mumkin, lekin ular teng bo‘lmasligi mumkin.

Ushbu shartnoma buzilishi (teng obyektlarning turli hashCodelarga ega bo‘lishi) hash asosidagi kolleksiyalarning noto‘g‘ri ishlashiga olib keladi: elementlar takroran qo‘shilishi mumkin (HashSetda), yoki topilmasligi mumkin (HashMapda).

Misol:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // other Person ekanligini tekshirish
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // atributlarni solishtirish
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // atributlardan hash yaratish
}

void main() {
  final p1 = Person('Alice', 30);
  final p2 = Person('Alice', 30);
  final p3 = Person('Bob', 25);

  print(p1 == p2); // true (qiymat bo‘yicha solishtirish, qayta yozilganidan keyin)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (hash va solishtirish orqali qidirish)
}