Sobes.tech
Middle

¿Cuáles son las reglas para los métodos equals y hashCode?

sobes.tech AI

Respuesta de la IA

  1. Si dos objetos son iguales según el método equals(Object), sus códigos hash (devueltos por el método hashCode()) deben ser iguales.
  2. 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.
  3. 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.
  4. Simetría: para cualquier objeto a y b, si a.equals(b) es true, entonces b.equals(a) también debe ser true.
  5. Reflexividad: para cualquier objeto no nulo a, a.equals(a) debe ser true.
  6. Transitividad: para cualquier objeto a, b y c, si a.equals(b) es true y b.equals(c) es true, entonces a.equals(c) también debe ser true.
  7. Consistencia: para cualquier objeto no nulo a y b, múltiples llamadas a a.equals(b) deben devolver consistentemente true o false, siempre que la información utilizada en las comparaciones equals(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...
}