web-dev-qa-db-fra.com

Adresse mémoire des variables en Java

Veuillez regarder l'image ci-dessous . Lorsque nous créons un objet en Java avec un nouveau 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:

  1. Quelle est cette sortie?
  2. Si c'est une adresse mémoire qui nous a été donnée par OS:

    a) Comment puis-je convertir cette chaîne en binaire?

    b) Comment puis-je obtenir une adresse de variable entière?

alt text

121
uzay95

C'est le nom de la classe et System.identityHashCode () séparés par le caractère '@'. Ce que représente le code de hachage d'identité est spécifique à l'implémentation. C'est souvent l'adresse de mémoire initiale de l'objet, mais l'objet peut être déplacé en mémoire par le VM au fil du temps. Donc (brièvement) vous ne pouvez pas compter sur ça.

Obtenir les adresses mémoire des variables n'a pas de sens en Java, car la machine virtuelle Java est libre de mettre en oeuvre des objets et de les déplacer comme bon vous semble (vos objets peuvent/vont se déplacer lors du nettoyage de la mémoire, etc.)

Integer.toBinaryString () vous donnera un entier sous forme binaire.

141
Brian Agnew

Il est possible d'utiliser Sun.misc.Unsafe: voir cette excellente réponse de @Peter Lawrey -> Y at-il un moyen d'obtenir une adresse de référence?

En utilisant son code pour printAddresses ():

    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)
27
JBE

C'est la sortie de l'implémentation "toString ()" de Object. Si votre classe remplace toString (), elle imprimera quelque chose de totalement différent.

11
Paul Tomblin

Ceci est pas l'adresse mémoire C'est classname @ hashcode

où 

nom de classe = nom complet ou nom absolu (nom du paquet suivi du nom de la classe)

hashcode = format hexadécimal (System.identityHashCode (obj) ou obj.hashCode () vous donnera un hashcode au format décimal)

5
Sunil Kumar Sahoo

Comme Sunil l'a dit, ce n'est pas l'adresse memory. C'est juste le hashcode

Pour obtenir le même contenu @, vous pouvez:

Si hashCode n'est pas remplacé dans cette classe:

"@" + Integer.toHexString(obj.hashCode())

Si hashCode est remplacé, vous obtenez la valeur d'origine avec:

"@" + Integer.toHexString(System.identityHashCode(obj)) 

Ceci est souvent confondu avec l'adresse mémoire car si vous ne substituez pas hashCode (), l'adresse mémoire est utilisée pour calculer le hachage.

2
Topera

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 cette information. Ce qui se passe réellement dans la RAM du système d'exploitation hôte dépend entièrement de la mise en œuvre de JRE.

1
James P.

En Java, lorsque vous créez un objet à partir d'une classe telle que Person p = new Person();, p est en réalité l'adresse d'un emplacement mémoire qui pointe vers un type de Person.

Lorsque vous utilisez un état pour imprimer p, vous verrez une adresse. La clé new Word crée un nouvel emplacement mémoire contenant toutes les variables d’instance et les méthodes incluses dans class Person et p est la variable de référence pointant vers cet emplacement mémoire.

1
Panduka Wedisinghe
0
himnabil