当我这样做时:
int x[] = new int[2];
System.out.println("...> " + x);
输出值如下:[I@1b67f74
以便十六进制数与已分配对象的内存地址有关?
和[I
这意味着什么?
答案 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),它以可靠的方式返回相同的值。