Comment est hashCode() calculé en Java
Quelle est la valeur hashCode()
méthode est de retour en java?
J'ai lu que c'est une mémoire de référence d'un objet... Lorsque j'imprime la valeur de hachage pour new Integer(1)
il est de 1; pour String("a")
est de 97.
Je suis confus: est-il ASCII ou quel type de valeur est?
Vous devez vous connecter pour publier un commentaire.
Un hashcode est une valeur entière qui représente l'état de l'objet sur lequel il a été appelé. C'est pourquoi un
Integer
qui est définie à 1 sera de retour un hashcode de "1", car uneInteger's
hashcode et sa valeur est la même chose. Un personnage hashcode est égal, c'est le caractère ASCII de code. Si vous écrivez un type personnalisé vous êtes responsable pour la création d'un bonhashCode
de mise en œuvre qui représentent le mieux l'état de l'instance actuelle.La valeur retournée par
hashCode()
est pas garanti à l'adresse mémoire de l'objet. Je ne suis pas sûr de la mise en œuvre dans leObject
classe, mais gardez à l'esprit que la plupart des classes de remplacerhashCode()
ces deux instances que sont sémantiquement équivalentes (mais ne sont pas la même instance) sera de hachage à la même valeur. Ceci est particulièrement important si les classes peuvent être utilisées au sein d'une autre structure de données, tels que le Jeu, qui s'appuie surhashCode
en étant compatible avec lesequals
.Il n'y a pas de
hashCode()
qui identifie de manière unique une instance d'un objet n'importe quoi. Si vous voulez un hashcode sur la base de pointeur (par exemple, dans le Soleil de la mise en œuvre), l'utilisationSystem.identityHashCode()
- ce de déléguer à la valeur par défauthashCode
méthode qu'il a été remplacé.Néanmoins, même
System.identityHashCode()
pouvez retourner la même valeur de hachage pour plusieurs objets. Voir les commentaires pour une explication, mais voici un exemple de programme qui génère en permanence des objets jusqu'à ce qu'il trouve à deux avec le mêmeSystem.identityHashCode()
. Quand je le lance, elle trouve rapidement les deuxSystem.identityHashCode()
s qui correspondent, en moyenne, après l'ajout d'environ 86 000 Long wrapper objets (et Entier des wrappers pour la clé) à une carte.Exemple de sortie:
Si vous voulez savoir comment elles sont mises en œuvre, je vous suggère de lire la source. Si vous utilisez un IDE, vous pouvez juste + sur une méthode qui vous intéresse et de voir comment une méthode est mise en œuvre. Si vous ne pouvez pas faire cela, vous pouvez google pour la source.
Par exemple, Entier.hashCode() est implémenté comme
et de la Corde.hashCode()
La
hashCode()
méthode est souvent utilisée pour l'identification d'un objet. Je pense que leObject
mise en œuvre retourne le pointeur (pas un vrai pointeur mais un id unique ou quelque chose comme ça) de l'objet. Mais la plupart des classes de remplacer la méthode. Comme leString
classe. Chaîne de deux objets n'ont pas le même pointeur, mais ils sont égaux:Je pense que l'utilisation la plus courante pour
hashCode()
est dansHashtable
,HashSet
, etc..API Java Objet hashCode()
Edit: (en raison d'une récente downvote et basé sur un article que j'ai lu sur les paramètres de la JVM)
Avec le paramètre de JVM
-XX:hashCode
vous pouvez changer la façon dont le hashCode est calculé (voir la Question 222 de la Java des Spécialistes de la Newsletter).Pas.
Object.hashCode()
utilisée pour retourner une adresse de mémoire d'environ 14 ans. Pas depuis.Ce qu'il est dépend entièrement de ce que la classe que vous parlez et si elle a ou non substituée `Objet.hashCode().
Objet.hashCode(), si ma mémoire est correctement (consultez la JavaDoc de java.lang.Objet), est dépendant de l'implémentation, et va changer en fonction de l'objet (la JVM de Sun, la dérive de la valeur à partir de la valeur de la référence à l'objet).
Noter que si vous êtes à la mise en œuvre de tout objet non trivial, et que vous voulez correctement les stocker dans une table de hachage ou HashSet, il est nécessaire de redéfinir hashCode() et equals(). hashCode() peut faire ce que vous voulez (c'est tout à fait légal, mais sous-optimale de l'avoir de retour 1.), toutefois, il est essentiel que si votre méthode equals() renvoie true, alors la valeur retournée par hashCode() pour les deux objets sont égaux.
La Confusion et le manque de compréhension de hashCode() et equals() est une grande source de bugs. Assurez-vous que vous familiariser avec la Javadoc de l'Objet.hashCode() et de l'Objet.equals(), et je peux vous garantir que le temps passé va payer pour lui-même.
De OpenJDK sources (JDK8):
Utiliser la valeur par défaut de 5 pour générer des codes de hachage:
Certains constante des données et de façon aléatoire un numéro généré avec une graine initié par thread:
Ensuite, cette fonction crée l'hashCode (par défaut 5 comme indiqué ci-dessus):
Ainsi, nous pouvons voir que, au moins dans JDK8 la valeur par défaut est aléatoire thread spécifique.
Si vous avez vraiment curieux d'apprendre puis de passer par ce code Hashing.class ;
Ici en premier param HASHING_SEED est calculé sur la base de code ci-dessous
le deuxième paramètre est de type char tableau de Chaîne de caractères , le troisième est toujours " 0 " et un quatrième est de type char longueur du tableau.
Et le calcul ci-dessus est juste pour la Chaîne de code de hachage.
Pour tout entier, son code de hachage sera sa valeur entière.
Pour char(jusqu'à deux lettres), il sera le code ASCII.
String::hashCode()
est calculé. Ou toute autre norme Java du type de hashcode ... autant que je sache. Le réel code pourString::hashCode()
est ici: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/...Autant qu'il est raisonnablement pratique, le hashCode de la méthode définie par la classe de l'Objet n'retour distincts entiers pour des objets distincts. (Ce qui est généralement mis en œuvre par la conversion de l'adresse interne de l'objet en entier, mais cette mise en œuvre technique n'est pas exigée par la Java langage de programmation.)
https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--