首页 > 解决方案 > 如何证明堆内存中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);
    }
}

在这里输入图片描述 谢谢大家

标签: java

解决方案


它不是内存地址。这是您的对象的 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()));

推荐阅读