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
相关产品推荐
相关产品推荐

