Compara dos objetos con el operador .equals() y ==

Resuelto Fastkowy asked hace 12 años • 17 respuestas

Construí una clase con un Stringcampo. Luego creé dos objetos y tengo que compararlos usando ==el operador y .equals()también. Esto es lo que he hecho:

public class MyClass {

    String a;

    public MyClass(String ab) {
        a = ab;
    }

    public boolean equals(Object object2) {
        if(a == object2) { 
            return true;
        }
        else return false;
    }

    public boolean equals2(Object object2) {
        if(a.equals(object2)) {
            return true;
        }
        else return false;
    }



    public static void main(String[] args) {

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        object1.equals(object2);
        System.out.println(object1.equals(object2));

        object1.equals2(object2);
        System.out.println(object1.equals2(object2));
    }


}

Después de la compilación, muestra dos veces falso como resultado. ¿Por qué es falso si los dos objetos tienen los mismos campos: "prueba"?

Fastkowy avatar Nov 15 '12 04:11 Fastkowy
Aceptado

==compara referencias de objetos, comprueba si los dos operandos apuntan al mismo objeto (no a objetos equivalentes , al mismo objeto).

Si desea comparar cadenas (para ver si contienen los mismos caracteres), debe comparar las cadenas usando equals.

En su caso, si dos instancias de MyClassrealmente se consideran iguales si las cadenas coinciden, entonces:

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}

...pero normalmente, si estás definiendo una clase, hay más equivalencia que la equivalencia de un solo campo ( aen este caso).


Nota al margen: si anula equals, casi siempre deberá anular hashCode. Como dice en el equalsJavaDoc :

Tenga en cuenta que generalmente es necesario anular el hashCodemétodo cada vez que se anula este método, para mantener el contrato general del hashCodemétodo, que establece que objetos iguales deben tener códigos hash iguales.

T.J. Crowder avatar Nov 14 '2012 21:11 T.J. Crowder

Deberías anular los iguales

 public boolean equals (Object obj) {
     if (this==obj) return true;
     if (this == null) return false;
     if (this.getClass() != obj.getClass()) return false;
     // Class name is Employ & have lastname
     Employe emp = (Employee) obj ;
     return this.lastname.equals(emp.getlastname());
 }
user5119219 avatar Jul 15 '2015 11:07 user5119219

La mejor manera de comparar 2 objetos es convirtiéndolos en cadenas json y compararlas; es la solución más sencilla cuando se trata de objetos, campos y/u objetos anidados complicados que contienen matrices.

muestra:

import com.google.gson.Gson;


Object a = // ...;
Object b = //...;
String objectString1 = new Gson().toJson(a);
String objectString2 = new Gson().toJson(b); 

if(objectString1.equals(objectString2)){
    //do this
}
JoeG avatar Feb 22 '2016 20:02 JoeG

Parece que equals2solo está llamando equals, por lo que dará los mismos resultados.

Hew Wolff avatar Nov 14 '2012 21:11 Hew Wolff