在Java中打印字符数组

14

如果我正常地打印出字符数组

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

输出结果为字符串。然而,如果我连接一个字符串,它会打印数组的内存位置。

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

我本来期望它会被打印为字符串,但不确定为什么出现这种行为。有任何解释吗?

7个回答

28

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

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

而且"" +真的是无意义的,应该被删除。

以下是为什么你得到了你所得到的。


System.out是一个PrintStreamprintln()有一个重载方法println(char[] x)

打印字符数组,然后终止该行。此方法的行为就像调用print(char[]),然后调用println()一样。


"" + c字符串连接,定义在JLS 15.18.1 字符串连接运算符+中:

如果只有一个操作数表达式的类型为String,则在运行时对另一个操作数进行字符串转换(§5.1.11)。

JLS 5.1.11 字符串转换说:

[...] 转换被视为使用无参的被引用对象的toString方法进行调用 [...]

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

ObjecttoString方法返回由以下内容组成的字符串:该对象是一个实例的类的名称,字符'@',以及对象的哈希码的无符号十六进制表示。换句话说,此方法返回与以下值相等的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
这就是为什么进行字符串拼接时会得到类似于[C@659e0bfd这样的结果。

注意,将char数组转换为String时,只需执行String my_string = new String(char_array);即可(即不需要在前面加上"" +)。 - Rob Hoff
@RobHoff,您认为答案中这个语句的意思是什么?“而且 "" + 真的很虚假,应该被删除。” - Andreas

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;
    }
}

1

最简单的形式是:

Arrays.toString(c);

如果它是一个二维数组,那么可以使用以下方式 Arrays.deepToString
Arrays.deepToString(twoDArray);

0

一个调用是PrintStream.println(char[]),另一个调用是PrintStream.println(String)

这是因为JVM首先评估"" + c。这是通过评估"" + c.toString()来完成的,这与c.toString()完全相同。

因此,您的调用等效于:

System.out.println(c);
System.out.println(c.toString());

这两个调用是不同的。


0

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

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

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

这样它们将在同一行上(因为print不使用换行符转到下一行),您就不必处理由于字符串连接而引起的任何复杂性。

更多信息,请参见 Oracle的Print Stream文档。以下是当char[]作为参数传递给print时的文档部分:

public void print(char[] s)

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


0
在第一种情况下,您拥有一个打印流实例。在第二种情况下,您将数组与字符串连接起来。如果您做了类似的事情,
System.out.println("" + c[0]); // or whatever number you put in there

它会打印出你要查找的字符串中的一部分。

String stringfromArray = "" + new String(c);

在编程方面,"" + 部分不是必需的。根据你问题的第二部分,would function more like what you are looking for


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Andreas

0

字符数组可以直接输出,因为它会一直输出直到值为null。 而字符数组不能使用toString()方法,因为它只会获取内存位置,所以你需要使用new String(字符数组)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接