如何证明堆内存中的Java对象存储的十六进制地址

时间:2018-11-16 04:43:59

标签: java

我想知道这个十六进制地址在内存堆中吗?在堆栈上?如何证明?

public class Arr {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println("The memory address of the arr array is:" + arr);
    }
}

enter image description here 谢谢大家

1 个答案:

答案 0 :(得分:1)

它不是内存地址。它是对象的toString表示形式的结果。实际上,您调用String.valueOf(arr),它等效于调用arr.toString()。

public static String valueOf(int i) {
    return Integer.toString(i);
}

它不是内存指针-它是从对象生成的hashCode。如果您查看一下字节码,就知道了

invokevirtual java.lang.Object.hashCode() : int [68]
invokestatic java.lang.Integer.toHexString(int) : java.lang.String [67]

要获得此结果,您所需要做的就是从对象中获取hashCode并将其转换为十六进制

    System.out.println("Out:" + arr);
    System.out.println("Out:" + String.valueOf(arr));
    System.out.println("Out:" + arr.toString());    
    System.out.println("Out:" + Integer.toHexString(arr.hashCode()));