Middle
Pourquoi les méthodes hashCode et l'opérateur de comparaison == sont-ils redéfinis ?
sobes.tech IA
Réponse de l'IA
La redéfinition de hashCode et de l'opérateur == (pour comparer des objets par valeur plutôt que par référence) est nécessaire pour le bon fonctionnement des collections basées sur le hachage, telles que HashSet et HashMap.
- Opérateur
==: Détermine quand deux objets sont considérés comme égaux. Par défaut, il compare les références des objets. En le redéfinissant, nous implémentons la logique de comparaison par contenu ou attributs de l'objet. - Méthode
hashCode: Retourne une valeur entière (code de hachage) pour l'objet. Si deux objets sont égaux selon l'opérateur==, leurshashCodedoivent être identiques. L'inverse n'est pas vrai (deux objets peuvent avoir le mêmehashCodemais ne pas être égaux).
Le non-respect de ce contrat (objets égaux avec des hashCode différents) entraîne un fonctionnement incorrect des collections hashées : les éléments peuvent être ajoutés plusieurs fois là où l'unicité est attendue (HashSet), ou ne pas être trouvés (HashMap).
Exemple :
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
bool operator ==(Object other) {
// Vérifie que other est une Person
if (identical(this, other)) return true;
if (other.runtimeType != runtimeType) return false;
// Compare les attributs
return other is Person && name == other.name && age == other.age;
}
@override
int get hashCode => Object.hash(name, age); // Génère un hash à partir des attributs
}
void main() {
final p1 = Person('Alice', 30);
final p2 = Person('Alice', 30);
final p3 = Person('Bob', 25);
print(p1 == p2); // true (comparaison par valeur après redéfinition)
print(p1 == p3); // false
final peopleSet = {p1};
print(peopleSet.contains(p2)); // true (recherche par hash et comparaison)
}