Compara dos objetos con el operador .equals() y ==
Construí una clase con un String
campo. 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"?
==
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 MyClass
realmente 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 ( a
en este caso).
Nota al margen: si anula equals
, casi siempre deberá anular hashCode
. Como dice en el equals
JavaDoc :
Tenga en cuenta que generalmente es necesario anular el
hashCode
método cada vez que se anula este método, para mantener el contrato general delhashCode
método, que establece que objetos iguales deben tener códigos hash iguales.
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());
}
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
}
Parece que equals2
solo está llamando equals
, por lo que dará los mismos resultados.