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 (հաշվարկ և համեմատություն)
}