如果我通常打印出一个char数组
char[] c = new char[]{'3','b','o'};
System.out.println(c); //prints 3bo
输出是一个字符串。但是,如果我连接一个String,它会打印出数组内存位置。
System.out.println("" + c); //prints [C@659e0bfd
我原本以为它会打印成String并且我确定为什么会出现这种情况。有什么解释吗?
答案 0 :(得分:9)
解决方案是使用new String(c)
:
System.out.println("" + new String(c));
"" +
真的是假的,应该删除。
以下是你得到的结果。
System.out
是PrintStream
。 println()
print(char[])
的重载超载:
打印一个字符数组,然后终止该行。此方法的行为就像调用
println()
然后调用"" + c
。
String
是字符串连接,在println(char[] x)
中定义:
如果只有一个操作数表达式是
toString()
类型,则在另一个操作数上执行字符串转换(JLS 15.18.1 String Concatenation Operator+
)以在运行时生成字符串。
§5.1.11说:
[...]转换的执行就好像通过调用引用对象的toString方法而没有参数[...]
toString
未定义数组,因此调用JLS 5.1.11 String Conversion方法:
类
Object
的{{1}}方法返回一个字符串,该字符串由类的名称组成,其对象是一个实例, at-sign < / strong> character&#39;@
&#39;,以及对象的哈希码的无符号十六进制表示。换句话说,此方法返回一个等于值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())
当您进行字符串连接时,这就是[C@659e0bfd
之类的内容。
答案 1 :(得分:1)
当您调用System.out.println(char [] array)时,PrintStream类会写入字符(其中一个重载处理作业)。
但是对于第二种情况,java通过调用其toString方法将char数组转换为字符串,该方法是一个常规数组toString方法。并将其与空字符串连接,您将收到数组签名[C * ....这是一个预期和正常的行为。
修改强> 下面是调用'System.out.println(c)'时最终调用的PrintStream代码:
private void write(char buf[]) {
try {
synchronized (this) {
ensureOpen();
textOut.write(buf);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush) {
for (int i = 0; i < buf.length; i++)
if (buf[i] == '\n')
out.flush();
}
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
答案 2 :(得分:0)
在第一种情况下,您在打印流中有一个实例。在第二种情况下,您将数组与字符串连接在一起。如果您做了类似
的事情System.out.println("" + c[0]); // or whatever number you put in there
它会打印一些您正在寻找的字符串。
String stringfromArray = "" + new String(c);
,功能更像您在问题的第二部分中所寻找的内容,但您不需要执行"" +
部分。
答案 3 :(得分:0)
一个电话是PrintStream.println(char[])
,另一个电话是PrintStream.println(String)
。
这是因为JVM首先评估"" + c
。这是通过评估与"" + c.toString()
完全相同的c.toString()
来完成的。
所以,你的电话相当于:
System.out.println(c);
System.out.println(c.toString());
这两个电话不同。
答案 4 :(得分:0)
char数组可以直接输出,因为它会坚持输出直到值 null 并且char 的数组不能使用toString()的方式,因为它只会获取内存位置,所以你可以使用新的String(char数组)
答案 5 :(得分:0)
以上所有都是不错的解决方案和解释。但是,还有另一种方法可以“绕过”此问题:
您可以使用两个打印语句,更具体地说,
System.out.print("");
System.out.print(c);
这样,它们将在同一行上(黑白打印不使用换行来转到下一行),并且由于String串联,您将不必处理任何麻烦。
有关更多信息,请参见 Print Stream Documentation by Oracle 。 这是当将char []作为参数传递时用于打印的文档部分:
公共无效打印(char [] s)
打印一个字符数组。这些字符将根据平台的默认字符编码转换为字节,并以完全write(int)方法的方式写入这些字节。
答案 6 :(得分:0)
最简单的形式是
Arrays.toString(c);
,如果它是2D数组,则按以下方式使用deepToString:
Arrays.deppToString(twoDArray);