我正在使用Java中的char[]
进行游戏,并使用下面的示例代码:
char[] str = "Hello World !".toCharArray();
System.out.println(str.toString());
System.out.println(str);
我得到以下输出:
[C@4367e003
Hello World !
我对此有一些疑问:
[C@4367e003
代表什么?它是一个内存地址吗?数字的含义是什么? [C@
的含义是什么?
我一直以为在对象上调用println()
会调用此对象的toString方法,但似乎不是这样吗?
谢谢!
答案 0 :(得分:8)
[C
表示它是一个字符数组([
表示数组; C
表示char
),而@4367e003
表示它位于内存中地址 [1] 4367e003
。如果您想要一个表示该字符数组的字符串,请尝试new String(str)
。
println
is overloaded;还有一个println
接受一个字符数组。如果您未传递基元String
或char[]
,则它会在对象上调用toString
,因为System.out.println(Object)
存在单独的重载。 Here is the documentation for the specific method that takes a character array.
以下是println
的重载(直接来自文档):
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)
您可以在this tutorial底部了解有关重载的详情。
[1]:从技术上讲,它实际上是对象哈希码的十六进制表示,但这通常是通过使用内存地址来实现的。请注意,它并不总是真正的内存地址;有时这不适合int
。更多信息in this quesiton。
答案 1 :(得分:3)
它正在对象上调用toString()
。该对象是一个不覆盖toString()
method coming from Object
的数组。对象的实现:
getClass()。getName()+'@'+ Integer.toHexString(hashCode())
[C
表示char([
)的数组(C
)。 Javadocs for Class#getName()
更详细地解释了它。
4367e003
是object's hash code,可能是内存地址。
尽可能合理实用,由hashCode方法定义 class Object确实为不同的对象返回不同的整数。 (这个 通常通过转换内部地址来实现 将对象转换为整数,但这种实现技术不是 JavaTM编程语言所要求的。)
当您不致电toString()
时,您实际上正在呼叫println
method that takes a char[]
,它知道如何打印字符。
答案 2 :(得分:1)
[C @ 4367e003代表什么?它是一个内存地址吗?数字的含义是什么?这是什么意思[C @?
这是字符数组的Object#toString
表示
[
表示数组 C
是一个编码字符,表示原始字符数组(找到所有编码here)
4367e003
是字符数组的十六进制表示对象哈希码
我一直以为在对象上调用println()会调用此对象的toString方法,但似乎不是这样吗?
它会调用toString
,但由于原始字符数组str
没有覆盖toString,因此调用Object#toString
要查看数组的内容,可以将数组包装成新的{ {1}}使用String
。
答案 3 :(得分:0)
这是对您的数组的引用,它以字符串形式打印出来。你想要的是Arrays.toString(str)
。并且不要忘记导入Arrays
类。
答案 4 :(得分:0)
第一个println()正在打印出字符数组的toString()方法。 toString()的默认实现是打印[
,C
用于char,@
符号,然后是数组的哈希码,默认情况下是数组的内存地址。