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); // Δημιουργεί hash από τα χαρακτηριστικά
}

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 (αναζήτηση βάσει hash και σύγκριση)
}