Colecciones Java – hashCode() y equals() – ¿Cómo anular el método equals() y hashcode() en Java?

Publicado: 2018-08-08
Java Collections hashCode y es igual

equals() y hashCode() en Java son dos métodos fundamentales que se declaran en la clase Object y en la biblioteca Java central o parcial.

Si tiene alguna de las siguientes inquietudes en Java, entonces está en el lugar correcto.

  • Prácticas de Java -> Implementando iguales
  • override – Anulando equals y hashCode en Java
  • Cómo anular el método equals () en Java
  • Cómo anular el método hashCode () en Java
  • Cómo anular los métodos equals y hashCode en Java
  • Cómo y por qué anular el método equals en Java
  • ¿Por qué siempre anular hashcode () si anula equals ()?

Echemos un vistazo a un ejemplo simple para comprender primero la Igualdad de Reference Equality Logical Equality . El operador de igualdad (==) compara las referencias (direcciones en la memoria) de las dos cadenas como dos números diferentes; esto se conoce como Reference equality .

Logical equality compara los datos de los objetos en lugar del valor de las referencias.

Producción:

hashCode y equals están estrechamente relacionados:

  • si anula equals , debe anular hashCode .
  • hashCode debe generar valores iguales para objetos iguales.
  • equals y hashCode deben depender del same set of significant fields . Debe utilizar el mismo conjunto de campos en ambos métodos. No está obligado a utilizar todos los campos. Por ejemplo, es muy probable que un campo calculado que depende de otros se omita de equals y hashCode .

Al implementar equals , los campos se comparan de manera diferente, según su tipo:

  • campos de objetos, incluidas las colecciones: use iguales
  • Enumeraciones con seguridad de tipo: utilice igual o == (equivale a lo mismo, en este caso)
  • campos de objetos posiblemente nulos: use tanto == como iguales
  • campos de matriz: use Arrays.equals
  • campos primitivos que no sean float o double : use ==
  • float : convertir a int usando Float.floatToIntBits , luego use ==
  • double : convertir a largo usando Double.doubleToLongBits , luego usar ==

Implementando código hash :

  • si una clase anula equals , debe anular hashCode
  • cuando ambos se reemplazan, equals y hashCode deben usar el mismo conjunto de campos
  • si dos objetos son iguales, entonces sus valores hashCode también deben ser iguales
  • si el objeto es inmutable, entonces hashCode es un candidato para el almacenamiento en caché y la inicialización diferida

Es un error popular pensar que hashCode proporciona un identificador único para un objeto. No es asi.

Por contrato general, el método equals() en Java debe ser reflexivo, simétrico, transitivo, consistente y cualquier referencia no nula debe devolver falso. En otras palabras, para valores arbitrarios de a, b y c, siempre deben pasar las siguientes pruebas:

Para la mejor práctica, use los pasos a continuación para implementar su método equals():

  • Use esto == eso para verificar la igualdad de referencia
  • Use instanceof para probar el tipo de argumento correcto
  • Transmita el argumento al tipo correcto
  • Compara campos significativos para la igualdad

Aquí hay un ejemplo completo.

CrunchifyImplementEqualsHashCode.java

Salida de la consola de Eclipse: