在 Java 中打印字符数组

2022-09-04 07:34:05

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

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

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

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

我本来以为它会打印为字符串,我确定为什么会发生这种行为。有什么解释吗?


答案 1

解决方案是使用新的字符串(c):

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

而且确实是假的,应该删除。"" +

以下是您获得所得到的原因。


System.out是一个打印流。 对 println(char[] x) 有一个重载:println()

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


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

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

JLS 5.1.11 字符串转换说:

[...]转换的执行就像调用引用对象的toString方法一样,没有参数[...]

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

类的方法返回一个字符串,该字符串由对象是其实例的类的名称at 符号字符 '' 和对象哈希代码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:toStringObject@

 getClass().getName() + '@' + Integer.toHexString(hashCode())

这就是为什么当你做字符串串联时,你会得到类似的东西。[C@659e0bfd


答案 2

最简单的形式是:

Arrays.toString(c);

如果它是一个 2D 数组,则按如下方式使用 Arrays.deepToString

Arrays.deepToString(twoDArray);