【问题标题】:Compare memory locations of two primitives比较两个原语的内存位置
【发布时间】:2018-07-22 04:16:02
【问题描述】:

有什么方法可以比较java中两个ints的内存位置吗?

int x = 25;
int y = 25;

我想检查并证明这两个变量是否引用了相同的值或者它们被创建了两次。

x == y

上面的行比较了不是我想要的文字 values。有什么想法吗?

【问题讨论】:

  • Java 中有一个Integer 池,但我认为原语不存在。
  • 没有。这在 Java 中是不可能的。
  • 如果我没记错的话,两个原语不能共享同一个内存位置。决赛可能,但我很怀疑。
  • 您的问题表明您可能走错了路。你能解释一下你为什么要这样做吗?
  • @AlexR 没有重要原因。只是为了探索语言的工作原理。

标签: java variables compare primitive


【解决方案1】:

虽然这不可能通过代码实现,但您可以查看 sn-p 生成的字节码。

0: bipush        25
2: istore_1
3: bipush        25
5: istore_2
6: return

看到bipush 被调用了两次,似乎进行了两次堆栈分配。不过,以后很可能会进行优化。

【讨论】:

  • @RoshanaPitigala 编译代码后,使用javap -verbose ClassName.class,将ClassName 替换为文件名。
  • 我同意查看字节码是个好主意,但如前所述:我们不知道 JIT 会将其变成什么。如果语义上可能,它很可能会优化这种值的重用。
  • @GhostCat 是的,这是有道理的。我还没有找到这方面的任何信息。
  • 好主意。谢谢!!
  • @RoshanaPitigala 没问题!
【解决方案2】:

你的要求是不可能的。

Java 中的原始值就是:原始。他们的“定义”中没有任何内容与内存位置有关。

不过,javac 编译器会进行常量折叠,当然如果这是您的问题,jit 会在运行时应用各种优化。但是你没有办法得到关于原始值的“内存布局”。即使是 *com.misc.Unsafe" 和 VarHandle 也只处理引用类型。

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 2012-11-22
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2015-02-18
    • 2016-01-22
    相关资源
    最近更新 更多