Java如何打印对象地址?
- 后端开发
- 2025-06-25
- 9
在Java中,直接打印对象的物理内存地址是不可行的,这是因为Java运行在Java虚拟机(JVM)上,JVM负责内存管理,开发者无法直接访问底层硬件地址,但可以通过以下方法获取对象的逻辑标识符(通常以十六进制形式呈现),它在大多数场景下可替代地址使用:
使用 hashCode() 方法
hashCode() 返回一个对象的整数哈希值,默认实现(未重写时)通常与对象的内存地址相关(但非物理地址),通过 Integer.toHexString() 可转换为十六进制格式:
输出示例:
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内存管理的阐述。

