Middle
¿Cuáles son las reglas para los métodos equals y hashCode?
sobes.tech AI
Respuesta de la IA
- Si dos objetos son iguales según el método
equals(Object), sus códigos hash (devueltos por el métodohashCode()) deben ser iguales. - Si dos objetos no son iguales según el método
equals(Object), sus códigos hash pueden ser iguales o diferentes. Es una buena práctica asegurar códigos hash diferentes para objetos no iguales para mejorar el rendimiento de las colecciones basadas en hash. - El método
hashCode()debe devolver valores iguales para el mismo objeto en múltiples llamadas, siempre que ninguna información utilizada para calcular el hash haya cambiado. - Simetría: para cualquier objeto
ayb, sia.equals(b)estrue, entoncesb.equals(a)también debe sertrue. - Reflexividad: para cualquier objeto no nulo
a,a.equals(a)debe sertrue. - Transitividad: para cualquier objeto
a,byc, sia.equals(b)estrueyb.equals(c)estrue, entoncesa.equals(c)también debe sertrue. - Consistencia: para cualquier objeto no nulo
ayb, múltiples llamadas aa.equals(b)deben devolver consistentementetrueofalse, siempre que la información utilizada en las comparacionesequals(Object)no cambie.
Ejemplo de implementación:
public class MyClass {
private int value;
private String name;
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Verificación de identidad de objetos
if (this == o) {
return true;
}
// Verificación del tipo de objeto
if (o == null || getClass() != o.getClass()) {
return false;
}
// Casting al tipo correcto
MyClass myClass = (MyClass) o;
// Comparación por campos
return value == myClass.value &&
Objects.equals(name, myClass.name); // Usamos Objects.equals para manejar nulls
}
@Override
public int hashCode() {
// Uso de Objects.hash para generar el hash code basado en los campos
return Objects.hash(value, name);
}
// Otros métodos...
}