Java引用值是地址值吗?

Java引用值是地址值吗?,java,pointers,reference,memory-address,Java,Pointers,Reference,Memory Address,当我这样做时: int x[] = new int[2]; System.out.println("...> " + x); 输出值如下:[I@1b67f74 所以十六进制数与分配对象的内存地址有关 和[I它意味着什么?不,该十六进制数不应解释为对象所在的内存地址。事实上,它是对象的哈希代码。object.toString()的API文档说明: class对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示形式组

当我这样做时:

int x[] = new int[2];
System.out.println("...> " + x);
输出值如下:
[I@1b67f74

所以十六进制数与分配对象的内存地址有关


[I
它意味着什么?

不,该十六进制数不应解释为对象所在的内存地址。事实上,它是对象的哈希代码。
object.toString()的API文档说明:

class对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
java.lang.Object.hashCode()
的API文档说明:

只要合理可行,class Object定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。)

因此,对于Sun的JVM,如果不重写
hashCode()
方法,那么它确实是对象的内存地址,但不能保证是这样,因此不应该依赖它

在纯Java中,没有(真实、可靠的)方法(在任何JVM上都可以)获取对象的内存地址;Java没有指针,并且引用与指针不完全相同

Java虚拟机规范的一部分解释了
[I
的含义;在本例中,它意味着您的变量是
int
的数组,来自:

十六进制数字是对象ID或哈希代码


[I
表示它是整数(
I
)的数组(
[
)。

I代表整数数组的类名。 vm中地址的编号,但由于哈希代码通常被重写,因此直接使用它来标识对象是不明智的。
为此,请使用System.identityHashcode(对象x),它以可靠的方式返回相同的值。

请注意,JVM可以自由地在内存中移动对象,因此System.identityHashcode()在Sun的JVM中,JVM返回初始地址。实际地址可能会更改。请注意,
System.identityHashCode
可以为不同的对象提供相同的值。在Sun的JVM中,它是从对象第一次调用
hashCode
时的地址派生的。例如,您会看到奇数的散列值,并且不会添加它们RESES。垃圾收集器也会移动内存中的对象。+1。还要注意,在64位虚拟机上,(32位)哈希代码和(64位)哈希代码之间不可能存在一对一的映射对象地址。我没有+1。严格来说,十六进制显示的数字是对象的identityHashcode值。如果对象的类没有重写hashcode方法,这只是对象的hashcode。identityHashcode可能与对象的原始地址有关,也可能与对象的原始地址无关。当然,它与对象的当前地址无关如果GC移动了它,它就不能寻址。@Stephen C-从
Object.toString()
文档中添加了引号。它并没有说它使用了identityHashCode值。对于其余部分,您所说的正是我上面写的。。。