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 el contenido de dos objetos. Por defecto, en la clase Object, compara las referencias de los objetos, es decir, determina si dos variables apuntan al mismo objeto en la memoria.

Sin embargo, la mayoría de las clases en Java (por ejemplo, String, Integer) redefinen este método para comparar los valores contenidos en los objetos, en lugar de sus referencias.

Al redefinir equals(), es importante seguir su contrato:

  • Reflexividad: x.equals(x) debe ser true para cualquier x no nulo.
  • Simetría: x.equals(y) debe ser true si y solo si y.equals(x) es true para cualquier x y y no nulos.
  • Transitividad: Si x.equals(y) y y.equals(z) son true, entonces x.equals(z) también debe ser true para cualquier x, y y z no nulos.
  • Consistencia: Múltiples llamadas a x.equals(y) deben devolver el mismo resultado, siempre que los objetos no cambien.
  • Para cualquier x no nulo, x.equals(null) debe ser false.

Ejemplo de redefinición de equals():

class MyObject {
    private int value;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Uso de equals():

// Comparación por referencia (por defecto en Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean byReference = obj1.equals(obj2); // false

// Comparación por valor (en `equals` redefinido)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean byValue = myObj1.equals(myObj2); // true

También es importante redefinir el método hashCode() al redefinir equals(), para mantener su contrato y evitar problemas con colecciones que utilizan hashing (por ejemplo, HashMap, HashSet).