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 (хеш жана салыштыруу аркылуу издөө)
}