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 και σύγκριση)
}