【发布时间】:2020-02-06 17:33:01
【问题描述】:
我编写了这段代码,想查看我从一个类创建的 2 个对象的内存位置,并创建一个特定变量的实例。
public class StaticFields {
int a = 12;
int b = 235;
public static void main(String[] args) {
StaticFields obj = new StaticFields();
int a = obj.a;
StaticFields obj2 = new StaticFields();
int c = obj2.a;
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(c));
}
}
为什么“a”和“c”的“identityHashCode”是一样的?
谢谢。
【问题讨论】:
-
仅供参考:
identityHashCode()返回的值与内存地址无关。一般情况下,Java 中无法获取对象的内存地址。 -
a和c都是 原始int值,因此当您调用identityHashCode()时需要Object,编译器将 自动装箱Integer对象的值,并缓存 -128 到 127 范围内的值以提高性能,因此每次调用具有值12的方法时都会得到相同的Integer对象。 -
here 是关于这件事的另一个 SO-thread。包括关于如何从对象推断堆地址的“解决方法”(当您使用不覆盖它的类的
toString()方法时看到的那个) -
@Andreas 感谢您的澄清,我删除了我的评论。