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:

  1. Quelle est cette sortie?
  2. 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?

alt text

112
demandé sur twlkyao 2009-12-25 16:10:42

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.

131
répondu Brian Agnew 2017-05-18 20:11:15

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)
21
répondu JBE 2017-05-23 10:31:30

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.

11
répondu Paul Tomblin 2009-12-25 13:30:38

ici pas d'adresse mémoire C'est nom de classe@hashcode

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)

5
répondu Sunil Kumar Sahoo 2013-12-18 06:08:04

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.

1
répondu James P. 2009-12-25 20:57:55

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.

1
répondu Topera 2016-08-09 13:56:59
0
répondu himnabil 2015-04-20 12:17:48

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.

0
répondu Panduka Wedisinghe 2016-01-01 06:59:10

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

-1
répondu Dattu V Sarvade 2017-08-31 16:56:00