当我做:
int x[] = new int[2];
System.out.println("...> " + x);
输出值是这样的:[I@1b67f74
这样十六进制数与分配对象的内存地址有关吗?
它[I
是什么意思?
当我做:
int x[] = new int[2];
System.out.println("...> " + x);
输出值是这样的:[I@1b67f74
这样十六进制数与分配对象的内存地址有关吗?
它[I
是什么意思?
不,该十六进制数字不应被解释为对象所在的内存地址。其实就是对象的哈希码。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
.
来自: Java:“[B@1ef9157”背后的语法和含义?二进制/地址?
十六进制数字是对象 ID 或哈希码。
[I
表示它是一个[
整数数组 ( ) ( I
)。
[I 代表 int 数组的类名。vm中的地址编号,但由于hashCode通常被覆盖,直接使用它来识别对象是不明智的。为此,请使用 System.identityHashcode(Object x) 以可靠的方式返回相同的值。