objects - use equals java
Cómo comparar dos objetos java (5)
1) == evalúa la igualdad de referencia en este caso
2) no estoy muy seguro acerca de los iguales, pero ¿por qué no reemplazar el método de comparación y plantarlo dentro de MyClass?
Esta pregunta ya tiene una respuesta aquí:
- Compara dos objetos con .equals () y == operador 16 respuestas
Tengo dos objetos de Java que están instanciados de la misma clase.
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
Si configuro ambas propiedades con los mismos valores exactos y luego verifico que son las mismas
if(myClass1 == myClass2){
// objects match
...
}
if(myClass1.equals(myClass2)){
// objects match
...
}
Sin embargo, ninguno de estos enfoques devuelve un valor verdadero. He verificado las propiedades de cada uno y coinciden.
¿Cómo comparo estos dos objetos para verificar que sean idénticos?
Debe proporcionar su propia implementación de equals()
en MyClass
.
@Override
public boolean equals(Object other) {
if (!(other instanceof MyClass)) {
return false;
}
MyClass that = (MyClass) other;
// Custom equality check here.
return this.field1.equals(that.field1)
&& this.field2.equals(that.field2);
}
También debe anular hashCode()
si existe la posibilidad de que sus objetos se utilicen en una tabla hash. Una implementación razonable sería combinar los códigos hash de los campos del objeto con algo como:
@Override
public int hashCode() {
int hashCode = 1;
hashCode = hashCode * 37 + this.field1.hashCode();
hashCode = hashCode * 37 + this.field2.hashCode();
return hashCode;
}
Vea esta pregunta para más detalles sobre la implementación de una función hash.
Debe sobrescribir correctamente el método equals () de la clase Object
Editar : Creo que mi primera respuesta fue malentendida, probablemente porque no era demasiado precisa. Así que decidí agregar más explicaciones.
¿Por qué tienes que anular equals ()? Bueno, porque esto está en el dominio de un desarrollador para decidir qué significa que dos objetos sean iguales. La igualdad de referencia no es suficiente para la mayoría de los casos.
Por ejemplo, imagine que tiene un HashMap cuyas claves son del tipo Persona. Cada persona tiene nombre y dirección. Ahora, quiere encontrar un bean detallado usando la clave. El problema es que normalmente no puede crear una instancia con la misma referencia que la que está en el mapa. Lo que debes hacer es crear otra instancia de la clase Persona. Claramente, el operador == no funcionará aquí y debe usar equals ().
Pero ahora, llegamos a otro problema. Imaginemos que su colección es muy grande y desea ejecutar una búsqueda. La implementación ingenua compararía su objeto clave con cada instancia en un mapa usando equals (). Eso, sin embargo, sería muy expansivo. Y aquí viene el hashCode (). Como otros señalaron, hashcode es un número único que no tiene que ser único. El requisito importante es que cuando equals () da verdadero para dos objetos, hashCode () debe devolver el mismo valor para ambos. La implicación inversa no se cumple, lo cual es bueno, porque hashcode separa nuestras claves en tipos de cubos. Tenemos un pequeño número de instancias de clase Person en un solo cubo. Cuando ejecutamos una búsqueda, el algoritmo puede saltar directamente a un cubo correcto y solo ahora ejecutar iguales para cada instancia. Por lo tanto, la implementación de hashCode () debe distribuir los objetos de la manera más uniforme posible en los segmentos.
Hay un punto más Algunas colecciones requieren una implementación adecuada de un método hashCode () en las clases que se utilizan como claves, no solo por motivos de rendimiento. Los ejemplos son: HashSet y LinkedHashSet. Si no anulan hashCode (), el método predeterminado Object hashCode () permitirá que se agreguen a su conjunto "no duplicates permitidos" varios objetos que podría considerar "significativamente iguales".
Algunas de las colecciones que usan hashCode ()
- HashSet
- LinkedHashSet
- HashMap
Eche un vistazo a esas dos clases de apache commons que le permitirán implementar equals () y hashCode () fácilmente
Necesita Anular equals
y hashCode
.
equals
comparará los objetos para la igualdad de acuerdo con las propiedades que necesita y hashCode
es obligatorio para que sus objetos se utilicen correctamente en Collections
y Maps
Necesita implementar el método equals () en su MyClass
.
La razón por la que ==
no funcionó es que esto es verificar que se refieran a la misma instancia. Como hiciste algo new
para cada uno, cada uno es una instancia diferente.
El motivo por el cual equals()
no funcionó es porque aún no lo implementó usted mismo. Creo que el comportamiento predeterminado es lo mismo que ==
.
Tenga en cuenta que también debe implementar hashcode()
si va a implementar equals()
porque muchas colecciones java.util esperan eso.