繁体   English   中英

用Java打印char数组

[英]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节 )以在运行时生成字符串。

JLS 5.1.11字符串转换说:

[...]转换的执行就好像通过调用引用对象的toString方法而没有参数[...]

没有为数组定义toString() ,因此调用了Object.toString()方法:

ObjecttoString方法返回一个字符串,该字符串由对象为实例的类名称, 符号字符“ @ ”和对象的哈希码的无符号十六进制表示组成。 换句话说,此方法返回一个等于值的字符串:

  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)

以上所有都是很好的解决方案和解释。 但是,还有另一种方法可以“绕过”这个问题:

您可以使用两个打印语句,更具体地说,

System.out.print("");
System.out.print(c);

这样它们就会在同一条线上(b / c打印不使用换行进入下一行),因为字符串连接,你不必处理任何复杂问题。

有关更多信息,请参阅Oracle打印流文档 以char []作为参数传递时,这是打印的文档部分:

public void print(char [] s)

打印一个字符数组。 根据平台的默认字符编码将字符转换为字节,这些字节的写入方式与write(int)方法完全相同。

最简单的形式是

Arrays.toString(c);

如果它是2D数组,则使用deepToString,如下所示:

Arrays.deppToString(twoDArray);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM