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 (ჰეშის და შედარების მიხედვით ძიება)
}