JAVA如何取地址
在Java中,直接获取对象的内存地址与C/C++等语言不同,因为Java的设计理念屏蔽了底层内存操作。以下是几种间接获取或模拟对象地址信息的方法:
获取对象的哈希码
Java的Object.hashCode()方法返回的哈希码可能与对象的内存地址相关(但并非绝对,取决于JVM实现)。默认实现通常基于内存地址生成:
Object obj = new Object();
int hashCode = obj.hashCode();
System.out.println("HashCode (可能关联地址): " + hashCode);
使用System.identityHashCode()
此方法始终返回与默认hashCode()相同的值,即使对象重写了hashCode()方法:

String str = "Hello";
int identityHash = System.identityHashCode(str);
System.out.println("IdentityHashCode: " + identityHash);
通过Unsafe类获取地址(高风险)
sun.misc.Unsafe类提供直接内存操作能力,但需注意:
-
该API非标准且可能随JDK版本变化

-
需要绕过安全管理器
try { Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); unsafeField.setAccessible(true); Unsafe unsafe = (Unsafe) unsafeField.get(null); Object obj = new Object(); long address = unsafe.getLong(obj, unsafe.arrayBaseOffset(Object[].class)); System.out.println("Estimated address: " + address); } catch (Exception e) { e.printStackTrace(); }
打印对象默认toString()
对象的默认toString()输出包含类名和哈希码组合:
Object obj = new Object();
System.out.println("Default toString(): " + obj);
// 输出示例: java.lang.Object@1b6d3586 (其中1b6d3586为哈希码的十六进制表示)
注意事项
- JVM可能使用地址压缩技术(如Compressed OOPs),使得"地址"并非真实物理地址
- 对象可能在GC过程中被移动,地址信息仅代表某一时刻状态
- 生产环境中应避免依赖内存地址,优先使用Java提供的对象标识机制






