En règle générale, l'implémentation par défaut de Object.hashCode()
est une fonction de l'adresse allouée de l'objet en mémoire (bien que cela ne soit pas imposé par la norme JLS ). Étant donné que la VM déplace les objets en mémoire, pourquoi la valeur renvoyée par System.identityHashCode()
ne changent jamais pendant la durée de vie de l'objet ?
S'il s'agit d'un calcul "one-shot" (l'objet hashCode
est calculé une fois et caché dans l'en-tête de l'objet ou quelque chose comme ça), cela signifie-t-il qu'il est possible pour deux objets d'avoir le même identityHashCode
(s'ils sont alloués pour la première fois à la même adresse dans la mémoire) ?
1 votes
Question connexe : Cette adresse mémoire est-elle une adresse mémoire réelle ou quelque chose de virtuel qui peut rester fixe même si l'objet est déplacé ? Si elle est virtuelle, ce serait une bonne chose car les pointeurs vers cette adresse n'auraient pas besoin d'être ajustés. D'un autre côté, cela signifierait une indirection supplémentaire et une table de correspondance potentiellement importante.
3 votes
Il s'agit d'un léger réarrangement de l'adresse lors de la première demande. (Renvoyer un code de hachage dont les bits de poids faible sont tous nuls n'est pas génial).
0 votes
En fait, où est-il indiqué que l'identityHashCode ne doit jamais changer ? La JavaDoc pour System.identityHashCode n'est pas claire à ce sujet.
0 votes
Bien entendu, si identityHashCode changeait, vous ne pourriez utiliser que des objets qui implémentent hashCode() comme clés dans les tables de hachage.
0 votes
Thilo - Cela découle de la spécification de hashCode et equals dans Object.
3 votes
D'accord, j'ai compris : "Chaque fois que (hashCode) est invoqué sur le même objet plus d'une fois au cours de l'exécution d'une application Java, la méthode hashCode doit toujours renvoyer le même entier, à condition qu'aucune information utilisée dans les comparaisons d'égalités sur l'objet ne soit modifiée." Dans ce cas, le terme "égal" désigne la comparaison de l'identité d'un objet.