est la sortie de Par exemple, si objet.hashcode () code> requise pour être identique à toutes les implémentations JVM pour le même objet? P>
"test" .HashCode () code> retourne
1 code> sur 1.4, pourrait-il potentiellement retourner
2 code> en cours d'exécution sur 1.6. Ou si si les systèmes d'exploitation étaient différents, ou une architecture de processeur différente entre les instances? p>
6 Réponses :
de l'API P>
Le contrat général de HASHCODE est: P>
Autant que c'est raisonnablement pratique, la méthode de code Hashcode définie par l'objet de classe renvoie des entiers distincts pour des objets distincts. (Ceci est typiquement mis en œuvre en convertissant l'adresse interne de l'objet en un entier, mais cette technique de mise en œuvre n'est pas requise par le langage de programmation Javatm.) P>
@Finnw: Oui ça fait; Le hashcode n'est pas tenu de renvoyer la même valeur sur différents exécutions i> de la même version sur le même système pour la même application, ce qui ne vous dérange pas à travers différentes versions ou différents systèmes ou différentes applications.
Le code de hachage d'identité est typiquement stocké dans l'en-tête d'objet (hotspot)
Non, le résultat de hashcode () code> est seul em> constante lors d'une seule exécution. Vous ne devriez pas vous attendre à ce que le résultat de la fonction soit identique entre les exécutions, encore moins entre les versions ou les plates-formes JRE. P>
non. La sortie de Cependant, dans l'exemple spécifique que vous avez donné, la valeur du hashcode code> est susceptible de modifier entre les implémentations JVM et même entre différentes exécutions d'un programme sur le même JVM em>. P>
"test" .hashcode () code> sera strong> être cohérent parce que la mise en œuvre de
hashcode code> pour
chaîne code> fait partie de l'API de
chaîne code> (voir
(Bien que ce soit différent si vous pouvez trouver un 1,0 JDK. La définition brisée dans l'API Docs lancerait des exceptions s'il est mis en œuvre.)
Il est également bien défini pour la plupart des collections
Tout d'abord, le résultat de HASHCODE dépend fortement du type d'objet et de sa mise en œuvre. Chaque classe, y compris ses sous-classes, peut définir son propre comportement. Vous pouvez compter sur elle à la suite du contrat général comme indiqué dans la Javadoc ainsi que dans d'autres réponses. Mais la valeur n'est pas nécessaire pour rester identique après un redémarrage VM. surtout si cela dépend des implémentations de .Hashcode des classes de soirée au fil. P>
Lorsque vous vous référez à la mise en œuvre concrète de la classe de chaîne, vous ne devez pas dépendre de la valeur de retour. Si votre programme est exécuté dans une machine virtuelle différente, cela pourrait potentiellement changer. P>
Si vous vous référez uniquement au Sun VM, on pourrait soutenir que Sun ne cassera pas - même mal programmé - code existant. donc "test" .Hashcode () retournera toujours exactement 3556498 pour toute version du Sun VM Strong>. p>
Si vous voulez vous tirer de manière délibérante dans le pied, allez-y et dépendez-en de cela. Les personnes qui devront réparer votre code en cours d'exécution sur la "Nintendo Java VM 2015" pour le sèche-cheveux "2015" vont crier votre nom la nuit. P>
Comme indiqué, pour de nombreuses implémentations, le comportement par défaut du hashcode () est de renvoyer l'adresse de l'objet. De toute évidence, cela peut être différent chaque fois que le programme est exécuté. Ceci est également cohérent avec le comportement par défaut des égaux (): Deux objets sont égaux uniquement si elles sont identiques sur le même objet (où X et Y sont à la fois non NULL, X.Equals (Y) si et uniquement si x == Y) . p>
Pour toutes les classes où HashCode () et Equals () sont remplacés, ils sont généralement calculés de manière déterministe basée sur les valeurs de certains ou de tous les membres. Ainsi, dans la pratique, il est probable que si un objet dans une exécution du programme peut être dit être égal à un objet dans une autre exécution du programme, et le code source est le même (y compris des éléments tels que le code source de chaîne .HashCode () si cela est appelé par la substitution de HashCode ()), les codes de hachage seront les mêmes. P>
Il n'est pas garanti, bien qu'il soit difficile de penser à un exemple réel raisonnable. p>
@Mark: Un exemple raisonnable est l'endroit où vous remplacez hashcode () code> et que le hashcode calc incluent le code HASHCode d'un objet composant dont le code
hashcode () code> n'est pas remplacé.
Cela le ferait, mais vous ne seriez pas en mesure de permettre à deux objets d'être égaux. Deux objets "égaux" auraient différents hashcodes. Si vous mettez un tel objet dans un hashmap, vous ne seriez pas en mesure de le retrouver.
La seule vérité: HashCode est la même pour la fonction de la demande. Une autre course peut donner d'autres hashcodes. P>
Lorsque vous demandez à HashCode d'objet, JVM le crée à l'aide de l'un des algorithmes de RNG et la met dans l'en-tête de l'objet pour une utilisation future.
Il suffit d'examiner get_next_hash < / a> fonction dans OpenJDK. P>
L'algorithme RNG est configurable avec JVM Arg 0 - Park-Miller RNG (par défaut) P>
1 - F (adresse, global) p>
2 - constante 1 p>
3 - Compteur séquentiel P>
4 - adresse de l'objet dans le tas p>
5 - Xorshift (le plus rapide) p>
Lorsque le code Hashcode est égal à l'adresse dans le tas - c'est parfois gênant, car GC peut déplacer des objets vers un autre tas de tas, etc. P>