Comment la JVM s'assurer que le Système.identityHashCode() ne changera jamais?
Généralement le défaut de mise en œuvre de Object.hashCode()
est une fonction de l'adresse de l'objet en mémoire (même si ce n'est pas mandaté par le JLS). Étant donné que la VM shunts des objets en mémoire, pourquoi la valeur retournée par System.identityHashCode()
jamais changer durant l'objet de la durée de vie?
Si c'est un "one-shot" de calcul (de l'objet hashCode
est calculée une fois et planqué dans l'objet de l'en-tête ou quelque chose), alors cela veut dire qu'il est possible pour les deux objets ont le même identityHashCode
(si ils arrivent à être d'abord affecté à la même adresse en mémoire)?
- Liés à la question: Est-ce que la mémoire de répondre à un véritable adresse mémoire ou quelque chose de virtuel qui peut rester fixe de même que l'objet se traînait sur? Si virtuel, ce serait sympa parce que les pointeurs ne seraient pas besoin d'être ajusté. D'autre part, cela signifierait une indirection supplémentaire et potentiellement une grande table de mappage.
- C'est un léger changement de l'adresse indiquée lors de la première demande. (En rentrant un code de hachage avec les bits de poids faible de tous les zéro n'est pas génial.)
- En fait, d'où vient-il dire que le identityHashCode ne doit jamais changer? La JavaDoc pour le Système.identityHashCode n'est pas évident.
- Bien sûr, si identityHashCode a changé, vous ne pourriez utiliser des objets qui implémente hashCode() en tant que clés dans les tables de hachage.
- Thilo - il résulte de la spécification de hashCode et equals dans l'Objet.
- Ok, eu: "Chaque fois que (hashCode) est invoquée sur le même objet plus d'une fois lors d'une exécution d'une application Java, la méthode hashCode doit constamment revenir par le même entier, a fourni aucune information utilisée dans les égaux des comparaisons sur l'objet est modifié." Et est égal dans ce cas est l'identité de l'objet de la comparaison.
Vous devez vous connecter pour publier un commentaire.
Moderne Jvm enregistrer la valeur dans l'objet de l'en-tête. Je crois que la valeur est généralement calculé uniquement sur la première utilisation afin de les garder le temps passé dans l'allocation des objets à un minimum (parfois jusqu'à une dizaine de cycles). La commune de la JVM de Sun peuvent être réunis pour que l'identité de code de hachage est toujours 1 pour tous les objets.
Plusieurs objets peuvent avoir la même identité de code de hachage. C'est la nature de codes de hachage.
En réponse à la seconde question, indépendamment de la mise en œuvre, il est possible que plusieurs objets ont le même identityHashCode.
Voir bug 6321873 pour une brève discussion sur le libellé dans la javadoc, et un programme pour démontrer la non-unicité.
identityHashCode
ne serait jamais retourner une valeur qui avait été renvoyé pour avec tout autre objet qui est toujours en existence. Selon la façon dont le gestionnaire de mémoire est mis en œuvre, cela pourrait être cher, ou il peut ajouter un zéro coût supplémentaire. Par exemple, unObject
pourrait contenir un index dans une table de pointeurs, chaque objet étant immuablement attribué une table fente pour aussi longtemps qu'il existe. Typique de la JVM des implémentations ne pas le faire...identityHashcode
est thread-safe. Si un code de hachage de l'objet n'a jamais été récupéré, il n'existe aucune garantie que la simultanéité "première" appels à l'identityHashCode
sur cet objet donnera la même valeur?L'en-tête d'un objet dans un HotSpot se compose d'un pointeur de classe et une "marque" de word.
Le code source de la structure de données pour la marque de mot peut être trouvé la
markOop.php
fichier. Dans ce fichier il y a un commentaire décrivant disposition de la mémoire de la marque mot:Ici, nous pouvons voir que l'identité de code de hachage pour la normale des objets Java sur un système 32 bits est enregistré dans la marque de mot et il est de 25 bits.
La directive générale pour la mise en œuvre d'une fonction de hachage est :
Autant que je sache, il est mis en œuvre pour le retour à la référence, qui ne changera jamais dans un des objets de la durée de vie .