Comment la machine virtuelle Java assurez-vous que System.identityHashCode () ne changera jamais?

StackOverflow https://stackoverflow.com/questions/1063068

Question

En général, la mise en œuvre 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 mandaté par le JLS ). Étant donné que les shunts VM objets au sujet de la mémoire, pourquoi la valeur retournée par System.identityHashCode() ne changera jamais pendant la durée de vie de l'objet?

S'il est un « one-shot » calcul (calcul de l'objet de hashCode une fois planqué dans l'en-tête d'objet ou quelque chose), alors ce que cela signifie qu'il est possible que deux objets ont la même identityHashCode ( si elles se trouvent d'abord être attribués à la même adresse en mémoire)?

Était-ce utile?

La solution

JVMs économies modernes la valeur dans l'en-tête d'objet. Je crois que la valeur est généralement calculée uniquement sur la première utilisation afin de garder le temps passé dans l'allocation de l'objet au minimum (parfois à aussi bas que d'une douzaine de cycles). La commune JVM Sun peut être compilé afin que le code de hachage d'identité est toujours 1 pour tous les objets.

Plusieurs objets peuvent avoir le même code de hachage d'identité. Telle est la nature des codes de hachage.

Autres conseils

En réponse à la deuxième question, quelle que soit la mise en œuvre, il est possible que plusieurs objets aient la même identityHashCode.

Voir bug 6321873 pour une brève discussion sur le libellé de la javadoc, et un programme visant à démontrer la non-unicité.

L'en-tête d'un objet en HotSpot se compose d'un pointeur de classe et un mot « marque ».

Le code source de la structure de données pour le mot de la marque se trouve le markOop.hpp fichier. Dans ce fichier, il y a un commentaire décrivant la mise en page de la mémoire du mot de marque:

  

hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)

Ici, nous pouvons voir que le code de hachage d'identité pour des objets Java normale sur un système 32 bits est enregistré dans le mot de la marque et il est de 25 bits.

La ligne directrice générale pour la mise en œuvre d'une fonction de hachage est:

  • le même objet doit retourner un code de hachage cohérent , il ne devrait pas changer avec le temps ou dépendent de toute information variable (par exemple un algorithme ensemencé par un nombre aléatoire ou des valeurs de champs des membres mutable
  • la fonction de hachage doit avoir un bonne répartition aléatoire , et par ce que je veux dire si vous considérez le hashcode comme des seaux, 2 objets doivent mapper différents seaux (hashcodes) dans la mesure du possible. La possibilité que 2 objets auraient la même hashcode devrait être rare - bien que peut se produire.

Pour autant que je sache, cela est mis en œuvre pour renvoyer la référence, qui ne changera jamais dans une vie d'objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top