Middle
¿Por qué se sobrescriben los métodos hashCode y el operador de comparación ==?
sobes.tech AI
Respuesta de la IA
La sobrescritura de hashCode y del operador == (para comparar objetos por valor en lugar de por referencia) es necesaria para el correcto funcionamiento de colecciones basadas en hash, como HashSet y HashMap.
- Operador
==: Define cuándo dos objetos se consideran iguales. Por defecto, compara las referencias de los objetos. Al sobrescribirlo, implementamos la lógica de comparación por contenido o atributos del objeto. - Método
hashCode: Devuelve un valor entero (código hash) para el objeto. Si dos objetos son iguales según el operador==, sushashCodedeben ser iguales. Lo contrario no es cierto (dos objetos pueden tener el mismohashCodepero no ser iguales).
El incumplimiento de este contrato (objetos iguales con diferentes hashCode) conduce a un funcionamiento incorrecto de las colecciones hash: los elementos pueden ser añadidos varias veces donde se espera unicidad (HashSet), o no podrán ser encontrados (HashMap).
Ejemplo:
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
bool operator ==(Object other) {
// Verifica que other sea Person
if (identical(this, other)) return true;
if (other.runtimeType != runtimeType) return false;
// Compara atributos
return other is Person && name == other.name && age == other.age;
}
@override
int get hashCode => Object.hash(name, age); // Genera hash a partir de los atributos
}
void main() {
final p1 = Person('Alice', 30);
final p2 = Person('Alice', 30);
final p3 = Person('Bob', 25);
print(p1 == p2); // true (comparación por valor tras sobrescribir)
print(p1 == p3); // false
final peopleSet = {p1};
print(peopleSet.contains(p2)); // true (búsqueda por hash y comparación)
}