Este escrito fue aprobado por nuestros expertos así garantizamos la veracidad de este artículo.
Solución:
los hashCode()
de Object
es en realidad un método nativo y la implementación en realidad no es Java puro. Ahora, con respecto a cómo funciona, esta respuesta de Tom Hawtin hace un gran trabajo al explicarlo:
Muchas personas afirmarán que
Object.hashCode
devolverá la dirección de la representación del objeto en la memoria. En las implementaciones modernas, los objetos realmente se mueven dentro de la memoria. En su lugar, se utiliza un área del encabezado del objeto para almacenar el valor, que puede derivarse de forma perezosa de la dirección de memoria en el momento en que se solicita el valor por primera vez.
Realmente vale la pena leer la respuesta completa.
Java no genera hashCode(), es decir, aquí no ocurre nada automático. Sin embargo, Object
genera un HashCode basado en la dirección de memoria de la instancia del objeto. La mayoría de las clases (sobre todo si lo vas a utilizar en alguno de los Collection
API) debe implementar su propio HashCode (y por contrato su propio método de igualdad).
De acuerdo con la documentación de la API de la plataforma Java, el cálculo del código hash se basa en la dirección JVM interna de 32 bits del objeto.
Está true que el objeto se mueve durante la ejecución (AFAIK, la única razón es el recolector de basura). Pero el código hash no cambia.
Así que cuando tienes un objeto como este
Person person1 = new Person();
person1.setName("Alex");
Person person2 = new Person();
person2.setName("Alex");
Person person3 = person2;
En este caso person1.hashCode no será igual a person2.hashCode porque las direcciones de memoria de estos dos objetos no son las mismas.
Pero person2.hashCode será igual a person3 porque apuntan al mismo objeto.
Entonces, si necesita usar el método hashCode para sus objetos, debe implementarlo usted mismo.
De paso La implementación de String.hashCode es diferente. Es algo como esto: (sintaxis de C#)
public int hashCode(String str)
int h = 0;
for (int i = 0; i < str.Length; i++)
h = (h * 31) + str[i];
return h;
editar: Aquí no se realiza ninguna comprobación de desbordamiento, por lo que el hashCode puede ser positivo o negativo.