Java 中变量的内存地址

请看下面的图片。当我们使用关键字在java中创建对象时,我们从操作系统获取内存地址。new

当我们编写时,我们可以看到一个“特殊”字符串作为输出。我的问题是:out.println(objName)

  1. 这个输出是什么?
  2. 如果是OS给我们的内存地址:

    a) 如何将此字符串转换为二进制?

    b) 如何获得一个整数变量地址?

alt text


答案 1

这是类名和 System.identityHashCode() 由 '@' 字符分隔。标识哈希代码表示的内容是特定于实现的。它通常是对象的初始内存地址,但随着时间的推移,VM 可以在内存中移动对象。所以(简而言之)你不能指望它是任何东西。

在Java中,获取变量的内存地址是没有意义的,因为JVM可以自由地实现对象并在看起来合适的情况下移动它们(你的对象可能会/将在垃圾回收期间移动等)。

Integer.toBinaryString() 将为您提供二进制形式的整数。


答案 2

可以使用:从@Peter Lawrey->有没有办法获得参考地址?sun.misc.Unsafe

使用其代码进行 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();
}

我设置了这个测试:

    //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);

下面是输出:

Hashcode :       125665513
Hashcode :       125665513
Hashcode (HEX) : 77d80e9
toString :       java.lang.Object@77d80e9
Address: 0x7aae62270

结论:

  • 哈希码 != 地址
  • toString = class@HEX(哈希码)