Java的参考值是地址值?
-
20-09-2019 - |
题
当我做的:
int x[] = new int[2];
System.out.println("...> " + x);
的输出值是这样的:[I@1b67f74
,使得十六进制数是关于到其中对象已分配的内存地址?
和[I
这是什么意思?
解决方案
没有,即十六进制数不应该被解释为在对象所在的存储器地址。事实上,它是对象的哈希码。 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:语法和意义背后 “[B @ 1ef9157”?二进制/地址?
在十六进制数字是对象ID或哈希码。
[I
意味着它是一个整数阵列([
)(I
)。
的
[I代表的int数组的类名。 VM中的地址的数量,但由于的hashCode通常覆盖,这不是明智的做法是直接用它来识别的对象。 对于这一点,使用System.identityHashcode(对象x),它返回以可靠的方式相同的值。
不隶属于 StackOverflow