Sobrescribiendo hashCode()

El método hashCode, es heredado de Object, normalmente de forma indirecta, y su utilidad principal es devolver un entero que representa al objeto.

Siempre que sobrescribes el método equals deberas sobrescribir el método hashCode para cumplir con el co…


This content originally appeared on DEV Community and was authored by Elías Canales

El método hashCode, es heredado de Object, normalmente de forma indirecta, y su utilidad principal es devolver un entero que representa al objeto.

Siempre que sobrescribes el método equals deberas sobrescribir el método hashCode para cumplir con el contrato.

Concretamente por la segunda regla: “If two objects are equal according to the equals method, then calling the hashcode method on each of the two objects must produce the same integer result”.

Como Java en principio devuelve un número de la referencia del objeto (como hashCode), si sobrescribes equals y tienes dos objetos iguales, su hashcode sera distinto, y por tanto, no estarás cumpliendo el contrato.

El hashCode debe

Durante una misma ejecución de programa, para objeto de un determinado equals siempre debe devolver el mismo hashCode. Pero para otra ejecución este valor no es necesario que sea el mismo.

Dos instancias distintas, pero que el equals es igual, deben devolver el mismo hashCode

Si dos objetos son distintos, el hashCode() no tiene porque ser distinto pero si para objetos distintos, el hashCode es distinto eso mejorara el número de colisiones, y por tanto, el rendimiento de las tablas hash.

Como lo implementamos

Tenemos que usar los atributos relevantes, que son los mismos que usamos en el equals para que dos objetos iguales tengan el mismo hashCode:

  1. Si el dato relevante es primitivo, aplicaremos TipoPrimitivo.hashCode()
  2. Si el dato relevante es complejo, y en el equals lo hemos hecho llamando recursivamente al equals del objeto, en este caso haremos lo mismo
  3. Si necesitas hacer una validación más compleja, entonces crea una representación del objeto con un tipo primitivo y llama al hashCode como en el punto 2.
  4. Si es nulo devuelve 0.
  5. Si es un array y tiene un elemento significativo usa ese como hashCode, si no tiene ninguno usa una constante que no sea 0, y si todos son relevantes usa Arrays.hashCode().
  6. Para combinar los distintos atributos, utiliza: hashCode = 31 * hashCode +
  7. Finalmente devuelve el hashCode

Creo que lo más peculiar es el 31, básicamente ese número se utiliza para reducir el número de colisiones. Dado que dos objetos distintos podrían tener el mismo hashCode, el objetivo es reducir las colisiones.

Además, los compiladores son capaces de optimizar mucho esa multiplicación.

Lombok

Podemos generar el equals y hashCode usando la anotación [@EqualsAndHashCode](https://projectlombok.org/features/EqualsAndHashCode) de lombok.

Referencias
https://www.geeksforgeeks.org/why-does-javas-hashcode-in-string-use-31-as-a-multiplier/
https://projectlombok.org/
Joshua Bloch, Effective Java (3ª edición), Addison-Wesley, 2018.


This content originally appeared on DEV Community and was authored by Elías Canales


Print Share Comment Cite Upload Translate Updates
APA

Elías Canales | Sciencx (2025-08-19T12:00:00+00:00) Sobrescribiendo hashCode(). Retrieved from https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/

MLA
" » Sobrescribiendo hashCode()." Elías Canales | Sciencx - Tuesday August 19, 2025, https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/
HARVARD
Elías Canales | Sciencx Tuesday August 19, 2025 » Sobrescribiendo hashCode()., viewed ,<https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/>
VANCOUVER
Elías Canales | Sciencx - » Sobrescribiendo hashCode(). [Internet]. [Accessed ]. Available from: https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/
CHICAGO
" » Sobrescribiendo hashCode()." Elías Canales | Sciencx - Accessed . https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/
IEEE
" » Sobrescribiendo hashCode()." Elías Canales | Sciencx [Online]. Available: https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/. [Accessed: ]
rf:citation
» Sobrescribiendo hashCode() | Elías Canales | Sciencx | https://www.scien.cx/2025/08/19/sobrescribiendo-hashcode/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.