Adresse mémoire des variables en Java
regardez la photo ci-dessous. Lorsque nous créons un objet en java avec un nouveau mot-clé, nous obtenons une adresse mémoire à partir de L'OS.
quand nous écrivons out.println(objName)
nous pouvons voir une chaîne "spéciale" comme sortie. Mes questions sont:
- Quelle est cette sortie?
-
si c'est l'adresse mémoire qui nous a été donnée par OS:
a) comment convertir cette chaîne en binaire?
B) Comment puis-je obtenir une adresse de variables entières?
9 réponses
qui est le nom de classe et le système .identityHashCode () séparé par le caractère'@'. Ce que représente le code de hachage d'identité est spécifique à la mise en œuvre. 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 VM au fil du temps. (Brièvement) vous ne pouvez pas compter sur quoi que ce soit.
obtenir les adresses mémoire des variables n'a pas de sens au sein de Java, puisque la JVM est libre d'implémenter objets et les déplacer comme bon vous semble (vos objets peuvent / vont se déplacer pendant la collecte des ordures, etc.))
entier.toBinaryString () vous donnera un entier sous forme binaire.
il est possible d'utiliser sun.misc.Unsafe
: voir cette grande réponse de @Peter Lawrey - > y a-t-il un moyen d'obtenir une adresse de référence?
utilisant son code pour les adresses imprimées ():
public static void printAddresses(String label, Object... objects) {
System.out.print(label + ": 0x");
long last = 0;
int offset = unsafe.arrayBaseOffset(objects.getClass());
int scale = unsafe.arrayIndexScale(objects.getClass());
switch (scale) {
case 4:
long factor = is64bit ? 8 : 1;
final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor;
System.out.print(Long.toHexString(i1));
last = i1;
for (int i = 1; i < objects.length; i++) {
final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor;
if (i2 > last)
System.out.print(", +" + Long.toHexString(i2 - last));
else
System.out.print(", -" + Long.toHexString( last - i2));
last = i2;
}
break;
case 8:
throw new AssertionError("Not supported");
}
System.out.println();
}
j'ai mis en place ce test:
//hashcode
System.out.println("Hashcode : "+myObject.hashCode());
System.out.println("Hashcode : "+System.identityHashCode(myObject));
System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode()));
//toString
System.out.println("toString : "+String.valueOf(myObject));
printAddresses("Address", myObject);
Voici la sortie:
Hashcode : 125665513
Hashcode : 125665513
Hashcode (HEX) : 77d80e9
toString : java.lang.Object@77d80e9
Address: 0x7aae62270
Conclusion:
- hashcode != adresse
- toString = class@HEX (hashcode)
qui est la sortie de l'implémentation" toString () " de L'objet. Si votre classe remplace toString (), elle imprimera quelque chose de complètement différent.
ici pas d'adresse mémoire C'est nom de classe@hashcode
où
classname = nom complet ou le nom absolu (ie nom du package suivi par le nom de classe)
hashcode = format hexadécimal (System.identityHashCode (obj) ou obj.hashCode () vous donnera hashcode au format décimal)
ce que vous obtenez est le résultat de la méthode toString() de la classe objet ou, plus précisément, le identityHashCode() comme uzay95 l'a souligné.
" lorsque nous créons un objet en java avec un nouveau mot-clé, nous obtenons une adresse mémoire à partir de L'OS."
il est important de se rendre compte que tout ce que vous faites en Java est géré par la machine virtuelle Java. C'est la JVM qui donne cette information. Ce qui se passe réellement dans le RAM de le système d'exploitation hôte dépend entièrement de la mise en œuvre de la JRE.
comme L'a dit Sunil, ce n'est pas adresse mémoire .C'est juste le hashcode
pour obtenir le même @ content, Vous pouvez:
si le hashCode n'est pas dépassé dans cette classe:
"@" + Integer.toHexString(obj.hashCode())
si hashCode est dépassé, vous obtenez la valeur originale avec:
"@" + Integer.toHexString(System.identityHashCode(obj))
ceci est souvent confondu avec l'adresse de mémoire parce que si vous n'outrepassez pas hashCode (), l'adresse mémoire est utilisée pour calculer le hachage.
c'est utile pour connaître le hashcode en java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode /
en Java lorsque vous fabriquez un objet à partir d'une classe comme Person p = new Person();
, p
est en fait une adresse d'un emplacement de mémoire qui pointe vers un type de Person
.
lorsque vous utilisez un statemenet pour imprimer p
vous verrez une adresse. Le mot clé new
fait un nouvel emplacement de mémoire contenant toutes les variables d'instance et les méthodes qui sont incluses dans class Person
et p
est la variable de référence pointant vers cette mémoire emplacement.
toString() est une fonction java.lang.La bibliothèque d'objets, qui renvoie la représentation de chaîne de caractères de référence D'objet le corps de toString () est comme suit
public String toString(Object arg)
{
return "fully_qualified_className@address";
}
ici l'adresse est donnée par JVM pas OS
vous pouvez outrepasser la fonction toString() en fournissant votre propre implémentation dans le corps de la fonction