Java引用值是地址值?

时间:2009-10-08 12:23:40

标签: java pointers reference memory-address

当我这样做时:

int x[] = new int[2];
System.out.println("...> " + x);

输出值如下:[I@1b67f74

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

[I这意味着什么?

4 个答案:

答案 0 :(得分:10)

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

  

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

 getClass().getName() + '@' + Integer.toHexString(hashCode())

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

  

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

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

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

Java虚拟机规范的

Section 4.3.2解释了[I的含义;在这种情况下,它表示您的变量是int的数组。

答案 1 :(得分:1)

自: Java: Syntax and meaning behind "[B@1ef9157"? Binary/Address?

  

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

[我代表一个int数组的类名。 vm中的地址编号,但由于hashCode通常被覆盖,因此直接使用它来识别对象并不明智。 为此,使用System.identityHashcode(Object x),它以可靠的方式返回相同的值。