java - metodo - para que es el hashcode
Diferentes campos para iguales y hashcode (2)
Estoy de acuerdo con la declaración de esta publicación ¿Qué problemas se deben tener en cuenta al anular equals y hashCode en Java?
Use el mismo conjunto de campos que usa para calcular equals () para calcular hashCode ().
Pero tengo algunas dudas:
- ¿Es esto absolutamente necesario tener los mismos campos?
- En caso afirmativo, ¿qué sucede si no uso el mismo campo?
- ¿Afectará el rendimiento de HashMap o la precisión de HashMap?
¿Es esto absolutamente necesario tener los mismos campos?
Sí, si no quieres sorpresas.
En caso afirmativo, ¿qué sucede si no uso el mismo campo?
Puede obtener hashCode
diferente para objetos que son iguales, como método equals()
, que es un requisito para los contratos equals y hashCode.
Por ejemplo, supongamos que tienes 3 campos: a
, b
, c
. Y usa los métodos a y b
para equals()
y los 3 campos para el método hashCode()
. Entonces, para 2 objetos, si a
y b
son iguales, c
es diferente, ambos serán iguales con diferentes códigos hash.
¿Afectará el rendimiento de HashMap o la precisión de HashMap?
No se trata de rendimiento, pero sí su mapa no se comportará como se esperaba.
Los campos no tienen que ser lo mismo. El requerimiento es para dos objetos que son iguales, deben tener el mismo código hash. Si tienen el mismo código hash, no tienen que ser iguales. De los javadocs:
- Cada vez que se invoca en el mismo objeto más de una vez durante una ejecución de una aplicación Java, el método hashCode debe devolver el mismo entero de forma consistente, siempre que no se modifique la información utilizada en comparaciones iguales en el objeto. Este entero no necesita ser consistente desde una ejecución de una aplicación hasta otra ejecución de la misma aplicación.
- Si dos objetos son iguales de acuerdo con el método equals (Object), entonces llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.
- No es necesario que si dos objetos son desiguales de acuerdo con el método equals (java.lang.Object), al invocar el método hashCode en cada uno de los dos objetos se produzcan resultados enteros distintos. Sin embargo, el programador debe tener en cuenta que la producción de resultados enteros distintos para objetos desiguales puede mejorar el rendimiento de las tablas hash.
Por ejemplo, podría devolver 1 como su código hash siempre, y usted obedecería el contrato del código hash, sin importar los campos que utilizó en el método equal.
Si se devuelve 1 todo el tiempo, mejoraría el tiempo de cálculo de hashCode, pero el rendimiento de HashMap disminuiría, ya que tendría que recurrir a igual () más a menudo.