[英]Printing char arrays in Java
如果我正常打印出一个char数组
char[] c = new char[]{'3','b','o'};
System.out.println(c); //prints 3bo
输出是一个字符串。 但是,如果我连接一个String,它会打印数组内存位置。
System.out.println("" + c); //prints [C@659e0bfd
我原以为它打印成一个字符串,我敢肯定为什么会出现这种情况。 有什么解释吗?
解决方案是使用new String(c)
:
System.out.println("" + new String(c));
并且"" +
真的是假的,应该删除。
以下是您获得所需内容的原因。
System.out
是一个PrintStream
。 println()
有一个println(char[] x)
的重载:
打印一个字符数组,然后终止该行。 此方法的行为就像调用
print(char[])
然后调用println()
。
"" + c
是字符串连接 ,它在JLS 15.18.1 String Concatenation Operator +
定义:
如果只有一个操作数表达式是
String
类型,则对另一个操作数执行字符串转换(第5.1.11节 )以在运行时生成字符串。
[...]转换的执行就好像通过调用引用对象的toString方法而没有参数[...]
没有为数组定义toString()
,因此调用了Object.toString()
方法:
类
Object
的toString
方法返回一个字符串,该字符串由对象为实例的类的名称, 符号字符“@
”和对象的哈希码的无符号十六进制表示组成。 换句话说,此方法返回一个等于值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())
这就是为什么当你进行字符串连接时你得到类似[C@659e0bfd
东西。
当您调用System.out.println(char [] array)时,PrintStream类会写入chars(其中一个重载处理作业)。
但是对于第二种情况,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;
}
}
在第一种情况下,您在打印流中有一个实例。 在第二种情况下,您将数组与字符串连接在一起。 如果你做了类似的事情
System.out.println("" + c[0]); // or whatever number you put in there
它会打印一些你正在寻找的字符串。
String stringfromArray = "" + new String(c);
,在你的问题的第二部分中,它的功能更像你正在寻找的东西,但你不需要做"" +
部分。
一个调用是PrintStream.println(char[])
,另一个调用是PrintStream.println(String)
。
这是因为JVM首先评估"" + c
。 这是通过评估与c.toString()
相同的"" + c.toString()
来c.toString()
。
所以,你的电话相当于:
System.out.println(c);
System.out.println(c.toString());
而这两个电话是不同的。
char的数组可以直接输出,因为它会坚持输出直到值为null而且char数组不能使用toString()的方式 ,因为它只会获取内存位置, 所以你可以使用新的String(数组) of char)
最简单的形式是
Arrays.toString(c);
如果它是2D数组,则使用deepToString,如下所示:
Arrays.deppToString(twoDArray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.