Veuillez jeter un œil à l'image ci-dessous. Lorsque nous créons un objet en java avec le new
mot - clé, nous obtenons une adresse mémoire du système d'exploitation.
Lorsque nous écrivons, out.println(objName)
nous pouvons voir une chaîne "spéciale" en sortie. Mes questions sont:
- Quelle est cette sortie?
Si c'est l'adresse mémoire qui nous a été donnée par le système d'exploitation:
a) Comment puis-je convertir cette chaîne en binaire?
b) Comment puis-je obtenir une adresse de variable entière?
Réponses:
C'est le nom de la classe et System.identityHashCode () séparés par le caractère «@». Ce que le code de hachage d'identité représente est spécifique à l'implémentation. Il s'agit souvent de l'adresse mémoire initiale de l'objet, mais l'objet peut être déplacé en mémoire par la machine virtuelle au fil du temps. Donc (brièvement) vous ne pouvez pas compter sur quoi que ce soit.
Obtenir les adresses mémoire des variables n'a pas de sens dans Java, car la JVM est libre d'implémenter des objets et de les déplacer comme bon lui semble (vos objets peuvent / vont se déplacer pendant le garbage collection, etc.)
Integer.toBinaryString () vous donnera un entier sous forme binaire.
la source
identityHashcode
, cela n'a pas de sens, ce n'est tout simplement pas infaillible. :)Il est possible d'utiliser
sun.misc.Unsafe
: voir cette excellente réponse de @Peter Lawrey -> Existe-t-il un moyen d'obtenir une adresse de référence?En utilisant son code pour printAddresses ():
J'ai mis en place ce test:
Voici la sortie:
Conclusion :
la source
C'est la sortie de l'implémentation "toString ()" d'Object. Si votre classe remplace toString (), elle affichera quelque chose de complètement différent.
la source
Ce n'est pas une adresse mémoire C'est classname @ hashcode
où
classname = nom qualifié complet ou nom absolu (c'est-à-dire le nom du package suivi du nom de la classe)
hashcode = format hexadécimal (System.identityHashCode (obj) ou obj.hashCode () vous donnera le hashcode au format décimal)
la source
Comme l'a dit Sunil, ce n'est pas une adresse mémoire, c'est juste le hashcode
Pour obtenir le même contenu @, vous pouvez:
Si hashCode n'est pas remplacé dans cette classe:
Si hashCode est remplacé, vous obtenez la valeur d'origine avec:
Ceci est souvent confondu avec l'adresse mémoire car si vous ne remplacez pas hashCode (), l'adresse mémoire est utilisée pour calculer le hachage.
la source
Ce que vous obtenez est le résultat de la méthode toString () de la classe Object ou, plus précisément, de identityHashCode () comme l'a souligné uzay95.
"Lorsque nous créons un objet en java avec un nouveau mot-clé, nous obtenons une adresse mémoire du système d'exploitation."
Il est important de réaliser que tout ce que vous faites en Java est géré par la machine virtuelle Java. C'est la JVM qui donne ces informations. Ce qui se passe réellement dans la RAM du système d'exploitation hôte dépend entièrement de l'implémentation du JRE.
la source
ceci est utile pour connaître le hashcode en java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
la source
En Java, lorsque vous créez un objet à partir d'une classe comme
Person p = new Person();
, ilp
s'agit en fait d'une adresse d'un emplacement mémoire qui pointe vers un type dePerson
.Lorsque vous utilisez un ensemble d'états pour imprimer,
p
vous verrez une adresse. Lenew
mot clé crée un nouvel emplacement mémoire contenant toutes les variables d'instance et les méthodes qui sont incluses dansclass Person
etp
est la variable de référence pointant vers cet emplacement mémoire.la source