Java中的引用到底是什么?

2022-09-03 18:29:23

Java中的引用到底是什么?它是内存地址吗?Java 引用是否等同于取消引用的C++指针?

换句话说,给定以下内容:

Object o1 = new Object();
Object o2 = new Object();

o1 == o2

上述比较是否等同于在C++中比较两个指针?


答案 1

o1 == o2几乎相当于比较C /C++中的两个指针,是的。

但是Java中的引用和C/C++中的指针之间有两个主要区别,这两个区别非常重要:

  • Java引用不能做指针算术:你不能“添加3”到一个引用,你只能让它指向另一个(已知)对象
  • Java引用是严格类型化的:你不能“重新解释”引用另一端的内容,除非你把它重新解释为该对象实际存在的类型。

还有一个关于“引用”这个词的简短说明:C++的引用与C中的指针和Java中的引用完全不同(但我对C++的了解还不够多,无法告诉您具体细节)。

有关此内容的详尽讨论,请参阅有关 programmers.SE 的此相关问题


答案 2

Java中的引用到底是什么?

它是对象的索引。它可以被认为是一个指针,但它的不同之处在于它

  • 可以随时更改。
  • 并不总是与内存地址有直接关系。
  • 在 64 位 JVM 中通常为 32 位。
  • 您无法重新解释引用所指的内容。您只能更改引用本身的类型。

上述比较是否等同于在C++中比较两个指针?

是的。


On Compresses Oops,它允许 64 位 JVM 起诉 32 位引用。

Java 热点™虚拟机性能增强 - 压缩的糟糕

热点 JVM 中的压缩 oops

IBM V6 - 使用压缩引用更有效地使用堆