Java引用值是地址值?

xde*_*000 2 java pointers reference memory-address

当我做:

int x[] = new int[2];
System.out.println("...> " + x);
Run Code Online (Sandbox Code Playgroud)

输出值如下: [I@1b67f74

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

并且[I这是什么意思?

Jes*_*per 10

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

类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符"@"和对象的哈希码的无符号十六进制表示组成.换句话说,此方法返回一个等于值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
Run Code Online (Sandbox Code Playgroud)

API文档java.lang.Object.hashCode()说:

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

所以对于Sun的JVM,如果你没有覆盖该hashCode()方法,那么它确实是对象的内存地址,但不能保证这样,所以你不应该依赖它.

没有(真实的,可靠的)方式(适用于任何JVM)以获得纯Java中对象的内存地址; Java没有指针,引用与指针不完全相同.

Java虚拟机规范的4.3.2节解释了它的[I含义; 在这种情况下,它意味着您的变量是一个数组int.

  • 在Sun的JVM上,它是在首次调用`hashCode`时从对象的地址派生的.例如,您会看到奇数哈希值,它们不会是地址.垃圾收集器也会在内存中移动对象. (4认同)
  • +1.另请注意,在64位VM上,(32位)哈希码和(64位)对象地址之间无法合理地进行一对一映射. (2认同)