2

当我做:

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

输出值是这样的:[I@1b67f74

这样十六进制数与分配对象的内存地址有关吗?

[I是什么意思?

4

4 回答 4

11

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

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

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

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

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

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

没有(真正的、可靠的)方法(适用于任何 JVM)在纯 Java 中获取对象的内存地址;Java没有指针,引用也不完全等同于指针。

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

于 2009-10-08T12:24:28.737 回答
1

来自: Java:“[B@1ef9157”背后的语法和含义?二进制/地址?

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

于 2009-10-08T12:26:25.243 回答
0

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

于 2009-10-08T12:28:37.127 回答
0

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

于 2009-10-08T12:30:06.183 回答