Sobes.tech
Middle

Чаро методҳои hashCode ва оператори муқоиса == навишта мешаванд?

sobes.tech AI

Ҷавоб аз AI

Иштироки hashCode ва оператори == (барои муқоиса кардани объектҳо ба асоси арзиш, на асоси ишора) барои кори дурустии ҷамъиятҳои асосёфта ба хеш, монанди HashSet ва HashMap, зарур аст.

  • Оператор == : Муқаррар мекунад, ки кай ду объект баробар ҳисоб мешаванд. Дар ҳолати пешфарз, он ишораҳоро муқоиса мекунад. Бо иваз кардани он, мо логикаи муқоисаи асосёфта ба мазмун ё хусусиятҳои объектро амалӣ мекунем.
  • Метод hashCode : Қимати ададии (код хеш) барои объект бармегардонад. Агар ду объект мувофиқи == баробар бошанд, hashCode-и онҳо мебояд якхела бошад. Баръакс, ду объект метавонанд якхела hashCode дошта бошанд, аммо баробар набошанд.

Насозиши ин шартнома (объектҳои баробар бо hashCode фарқкунанда) ба кори нодурустии ҷамъиятҳои асосёфта ба хеш оварда мерасонад: унсурҳо метавонанд чандин маротиба илова шаванд, ки дар он ҷо ягонагӣ интизор аст (HashSet), ё пайдо кардан мушкил мешавад (HashMap).

Масалан:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Санҷед, ки other Person аст
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Муқоиса кардани хусусиятҳо
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Ҳаши аз хусусиятҳо
}

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

  print(p1 == p2); // true (мувофиқ ба арзиш пас аз иваз кардан)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (ҷустуҷӯ бо хеш ва муқоиса)
}