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.