Sobes.tech
Junior

¿Qué hace el método equals() en Java?

sobes.tech AI

Respuesta de la IA

El método equals() en Java se utiliza para comparar dos objetos por igualdad. Por defecto, en el caso de objetos que heredan de Object sin sobrescribirlo, compara las referencias de los objetos (==), es decir, verifica si las variables apuntan a la misma ubicación de memoria.

Sobrescribir correctamente el método equals() es importante para comparar objetos por su contenido, no por su ubicación en memoria.

Al sobrescribir equals(), se deben seguir las siguientes reglas:

  • Reflexividad: para cualquier objeto no nulo x, x.equals(x) debe devolver true.
  • Simetría: para cualquier par de objetos no nulos x y y, si x.equals(y) devuelve true, entonces y.equals(x) también debe devolver true.
  • Transitividad: para objetos no nulos x, y y z, si x.equals(y) devuelve true y y.equals(z) devuelve true, entonces x.equals(z) también debe devolver true.
  • Consistencia: para objetos no nulos x y y, múltiples llamadas a x.equals(y) deben devolver consistentemente el mismo resultado, siempre que la información utilizada para la comparación no cambie entre llamadas.
  • Para cualquier objeto no nulo x, x.equals(null) debe devolver false.

Normalmente, al sobrescribir equals(), también se debe sobrescribir el método hashCode(), manteniendo el contrato: si dos objetos son iguales según equals(), sus códigos hash, devueltos por hashCode(), deben ser iguales. La reciprocidad no es obligatoria: si los códigos hash son iguales, los objetos no necesariamente son iguales.

Ejemplo de sobrescritura:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Comparación en sí
        if (this == o) return true;
        // Verificación de null y tipo de objeto
        if (o == null || getClass() != o.getClass()) return false;
        // Conversión de tipo y comparación por campos
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Generación del código hash basada en los campos
        return Objects.hash(value, name);
    }

    // getters, setters, etc.
}