You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何获取变量内存地址?为何两变量的identityHashCode一致?

为什么从不同对象获取的int变量的identityHashCode相同?

咱们先拆解一下你的代码和问题的核心原因:

  • 你操作的不是对象实例变量本身
    代码里的int a = obj.a;和int c = obj2.a;,是把两个对象的实例变量a(值都是12)赋值给了局部基本类型变量a和c。这两个局部变量是基本数据类型int,不是对象,本身不存在所谓的"内存位置哈希"。

  • 自动装箱触发了Integer缓存机制
    System.identityHashCode()方法要求传入Object类型参数,当你传入基本类型int时,Java会自动把它装箱成Integer对象。而Java为了性能优化,对**-128到127之间的Integer数值做了全局缓存**——也就是说,只要你装箱的是这个范围内的数值,不管多少次,都会拿到同一个Integer实例。

    你的实例变量a的值是12,正好在缓存范围内,所以两次装箱得到的是同一个Integer对象,调用identityHashCode()自然会得到相同的结果。

  • 验证结论的小测试
    如果你把实例变量a的值改成128(超出缓存范围),再运行代码,会发现两次的哈希值不一样了——因为此时每次装箱都会创建一个新的Integer对象。

另外补充一点:你原本想查看对象中特定变量的内存位置,但这种方式其实达不到目的。System.identityHashCode()返回的是对象的哈希值(基于对象内存地址生成),但基本类型的局部变量存储在栈上,而且Java本身没有提供直接获取实例变量内存地址的API,因为JVM会负责内存的管理和优化,开发者不需要直接操作内存地址。

内容的提问来源于stack exchange,提问作者Aryan Gates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:38