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:
- Si el dato relevante es primitivo, aplicaremos TipoPrimitivo.hashCode()
- 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
- 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.
- Si es nulo devuelve 0.
- 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().
- Para combinar los distintos atributos, utiliza: hashCode = 31 * hashCode +
- 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

Elías Canales | Sciencx (2025-08-19T12:00:00+00:00) Sobrescribiendo hashCode(). Retrieved from 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.