Object@1b6d3586
),这并非真实内存地址,若需近似地址,可调用System.identityHashCode(obj)
获取哈希码并转为十六进制:,“java,Object obj = new Object();,System.out.println(Integer.toHexString(System.identityHashCode(obj)));,
“,注意:Java不暴露真实物理地址,此哈希码仅作唯一标识,可能因JVM实现而异。在Java中,直接打印对象的物理内存地址是不可行的,这是因为Java运行在Java虚拟机(JVM)上,JVM负责内存管理,开发者无法直接访问底层硬件地址,但可以通过以下方法获取对象的逻辑标识符(通常以十六进制形式呈现),它在大多数场景下可替代地址使用:
使用 hashCode()
方法
hashCode()
返回一个对象的整数哈希值,默认实现(未重写时)通常与对象的内存地址相关(但非物理地址),通过 Integer.toHexString()
可转换为十六进制格式:
Object obj = new Object(); // 打印逻辑地址的十六进制表示 System.out.println(obj); // 隐式调用toString(),输出格式:类名@哈希值 System.out.println(Integer.toHexString(obj.hashCode())); // 显式输出哈希值
输出示例:java.lang.Object@6d311334
6d311334
(即 hashCode()
的十六进制形式)
注意:若类重写了
hashCode()
(如String
),返回值可能与内存无关,此时需用System.identityHashCode()
。
使用 System.identityHashCode()
此方法返回对象的原始哈希值,即使类重写了 hashCode()
也有效:
String str = "Hello"; System.out.println(System.identityHashCode(str)); // 十进制整数 System.out.println("0x" + Integer.toHexString(System.identityHashCode(str))); // 十六进制
输出示例:1627674070
0x610064f6
数组的“地址”打印
数组直接调用 toString()
会返回 [类型@哈希值
格式:
int[] arr = {1, 2, 3}; System.out.println(arr); // 输出示例:[I@7ba4f24f
[I
表示int
数组。7ba4f24f
是哈希值的十六进制形式。
为什么无法获取物理内存地址?
- JVM内存管理:对象在堆中的位置可能被垃圾回收器移动,物理地址不固定。
- 安全性:禁止直接内存访问以避免程序破坏JVM稳定性。
- 跨平台性:Java设计为“一次编写,到处运行”,物理地址依赖具体硬件和操作系统。
替代方案:唯一标识对象
hashCode()
与identityHashCode()
:作为对象的逻辑标识符。- 运算符:比较两个对象的引用是否指向同一内存位置。
- 日志框架:如SLF4J,可结合
identityHashCode()
跟踪对象。
方法 | 使用场景 | 注意事项 |
---|---|---|
obj.hashCode() |
默认未重写时关联内存地址 | 重写后可能无效 |
System.identityHashCode() |
始终返回JVM原始哈希值 | 推荐用于唯一标识 |
数组的 toString() |
直接打印数组的哈希标识 | 格式为 [类型@十六进制哈希值 |
Java的“地址”打印本质是逻辑标识符,而非物理地址,若需底层内存操作,可考虑
sun.misc.Unsafe
类(但强烈不推荐,因其破坏跨平台性且高版本Java已限制访问)。
引用说明: 基于Oracle官方文档对 Object.hashCode()
和 System.identityHashCode()
的说明,以及《Java核心技术卷I》中关于JVM内存管理的阐述。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38573.html