Comment faire hashCode() et identityHashCode() travail à la fin?
Comment de l'Objet.hashCode()
et System.identityHashCode()
travail à la fin? Ne identityHashCode()
retour à la référence de l'objet? Ne hashCode()
dépendent de l' ? de l'objet ? opérateur == comment faire pour travailler en back-end.
Quelle est la différence entre hashCode()
et identityHashCode()
?
- Parlez-vous de Java? Plus de contexte serait sympa...
- J'ai essayé de "réparer" la question, mais je ne peux en connaît pas la deuxième partie de la question.
- Comment la JVM s'assurer que le Système.identityHashCode() ne changera jamais? permettra de clarifier un certain nombre d'ambiguite.
Vous devez vous connecter pour publier un commentaire.
En supposant qu'il n'a pas été remplacé, le
Object.hashCode()
méthode appelle simplementSystem.identityHashCode(this)
.Le comportement exact de
System.identityHashCode(Object)
dépend de la JVM. (La réelle mise en œuvre récente de la Jvm Hotspot est plutôt malin, mais je m'égare.)Pas. Elle renvoie un
int
, et unint
ne peut pas contenir une référence. (Duh!)Que l'entier retourné par
identityHashCode
peut être liée à la (une) machine de l'adresse de l'objet, ou il peut ne pas être1. La valeur retournée paridentityHashCode()
est la garantie de ne pas changer pour la durée de vie de l'objet. Cela signifie que le GC déplace un objet (après unidentityHashCode()
appel), alors il ne peut pas utiliser la nouvelle adresse d'objet que l'identité hashcode.Ce n'est pas logique. Il n'y a pas de
? ==
ou?==
opérateur en Java.Ceci est en partie expliqué ci-dessus. D'autres différences sont les suivantes:
La
hashcode()
méthode est un non définitif de la méthode d'instance, et devrait être remplacé dans une catégorie où laequals(Object)
est remplacée. En revanche,identityHashCode(Object)
est unstatic
méthode et, par conséquent, ne peut pas être remplacée.La
identityHashCode(Object)
méthode vous donne un identificateur d'un objet qui peut (en théorie) être utilisé pour d'autres choses que de hachage et les tables de hachage. (Malheureusement, il n'est pas un unique identifiant, mais il est garantie de ne jamais changer pour la durée de vie de l'objet.)1 - Pour la génération actuelle de machines virtuelles, il n'est pas lié à l'adresse de la mémoire à tous. Voir @bestsss de la réponse.
identityHashCode() fonctionne comme ça (et comme de maintenant, il n'a rien à faire pour w/de l'adresse, de l'esp. puisque les adresses sont 64bits long, ok alignées, et 61)
Vérifie si il y a déjà généré un, si oui retourne. Vous pouvez supposer qu'il y a une place dans l'en-tête objet pour que
int
;autrement: génère un nombre aléatoire (
iirc twisterMarsaglia maj-xor algorithme), chaque thread natif a ses propres semences, donc pas d'info.TAS le
identityHashCode
champ dans l'en-tête objet de mise à jour w/le nouveau numéro généré. si le TAS de réussite renvoie la valeur, si ce n'est pas le champ contient déjà un générésidentityHashCode
.vous pouvez voir le reste des réponses sur la substitution hashcode.
bas de ligne:
si la javadoc encore les états de rien au sujet des adresses et identityHashCode, quelqu'un a besoin de la mettre à jour.
C'est à peu près la mise en œuvre spécifique. La seule garantie que vous obtenez est
(À partir de la version 1.6 de Java JavaDoc)
En théorie, cela signifie que les valeurs pourraient être déterminé de façon arbitraire et pourrait même être de zéro pour chaque objet. Dans la pratique, c'est probablement un dérivé de l'adresse de l'objet. Bien sûr, vous devez être prudent à ce sujet. La JVM peut déplacer les objets que si il pense que c'est une bonne idée lors d'une collecte de déchets, de sorte qu'il ne va pas être "juste" l'adresse de la mémoire. Il pourrait être établi à partir d'un compteur global, ou une table de hachage de l'objet d'origine du lieu, ou à partir d'un générateur de nombre aléatoire, etc.
hashCode()
et est souvent remplacé par les classes dérivées à se conformer aux règles deequals()
/hashCode()
.System.identityHashCode()
fournit un moyen d'obtenir la valeurObject.hashCode()
serait de retour pour cet objet, même si elle contient un remplacement pour cette méthode. Cela vous permet de faire des contenants de travail avec l'identité sémantique, depuis==
etSystem.identityHashCode()
traiter chaque objet de manière unique.Voir [Java docs]
Donc si quelqu'un a remplacé
hashCode()
méthode dans sa catégorie, mais veut tout de même le défauthashCode()
valeur qui aurait été retourné par ObjethashCode()
ensuite utiliserSystem.identityHashCode()
Donc,
hashCode()
appelle en interneSystem.identityHashCode()
aussi longtemps que vous n'êtes pas primordial dans votre classe, si vous substituez hashCode() ce qui fera appel à votre mise en œuvre.Beaucoup de réponses données ci-dessus, il faut juste ajouter quelques points.
Quand nous disons
obj.hashCode()
le contenu de l'obj est considéré comme, d'autre partdans
System.identityHashCode(obj)
le contenu ne sont pas prises en considération, ainsiidentityHashCode
pour deuxString
,int
(avec la même valeur) seront différentes maisHashcode
sera le même.En cas de
String
pour obteniridentityHashCode
chaîne piscine joue un rôle important, par exempleici
s1
ets3
pointant vers le même ref doncidentityHashCode
pours1 and s3
est toujours la même ets2
sera différent.Même pour
int
aussi,IntegerCache
joue un rôle important pour obtenir leidentityHashCode