【问题标题】:How to Access Variable's Memory Address In Java? [duplicate]如何在 Java 中访问变量的内存地址? [复制]
【发布时间】: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 中无法获取对象的内存地址。
  • ac 都是 原始 int 值,因此当您调用 identityHashCode() 时需要 Object,编译器将 自动装箱 Integer 对象的值,并缓存 -128 到 127 范围内的值以提高性能,因此每次调用具有值 12 的方法时都会得到相同的 Integer 对象。
  • here 是关于这件事的另一个 SO-thread。包括关于如何从对象推断堆地址的“解决方法”(当您使用不覆盖它的类的 toString() 方法时看到的那个)
  • @Andreas 感谢您的澄清,我删除了我的评论。

标签: java oop variables


【解决方案1】:

这两个整数的值相同,都是 12。

由于缓存了整数(对于从 -128 到 127 的值),返回的两个对象的哈希码值相同。

b 不是这样,因为它的值大于 127。

【讨论】:

  • intObject(方法的参数类型)的 identityHashCode() 无关。
  • 试试obj.bobj2.b。它们也具有“相同的价值”,但是...
  • @Seelenvirtuose - obj.b 和 obj2.b 的哈希码值不同。
  • 感谢您的回答。现在,我的问题是 int c 和 int a 具有相同的内存位置?我的意思是它们指向一个内存位置吗?或者它们在内存中有不同的对象,因为它们来自不同的实例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2022-10-02
  • 2012-01-05
  • 1970-01-01
  • 2010-11-01
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多