用Java打印char数组

时间:2016-04-01 22:28:02

标签: java arrays

如果我通常打印出一个char数组

char[] c = new char[]{'3','b','o'};
System.out.println(c); //prints 3bo

输出是一个字符串。但是,如果我连接一个String,它会打印出数组内存位置。

System.out.println("" + c); //prints [C@659e0bfd

我原本以为它会打印成String并且我确定为什么会出现这种情况。有什么解释吗?

7 个答案:

答案 0 :(得分:9)

解决方案是使用new String(c)

System.out.println("" + new String(c));

"" +真的是假的,应该删除。

以下是你得到的结果。

System.outPrintStreamprintln() 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);