用Java打印字符数组

用Java打印字符数组,java,arrays,Java,Arrays,如果我正常打印一个字符数组 char[] c = new char[]{'3','b','o'}; System.out.println(c); //prints 3bo 输出是一个字符串。但是,如果我连接一个字符串,它将打印数组内存位置 System.out.println("" + c); //prints [C@659e0bfd 我本来希望它以字符串的形式打印,我知道为什么会发生这种行为。有什么解释吗?在第一种情况下,您在打印流中有一个实例。在第二种情况下,使用字符串连接数组。如果你做

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

char[] c = new char[]{'3','b','o'};
System.out.println(c); //prints 3bo
输出是一个字符串。但是,如果我连接一个字符串,它将打印数组内存位置

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

我本来希望它以字符串的形式打印,我知道为什么会发生这种行为。有什么解释吗?

在第一种情况下,您在打印流中有一个实例。在第二种情况下,使用字符串连接数组。如果你做了类似的事情

System.out.println("" + c[0]); // or whatever number you put in there
它会打印一些您正在寻找的字符串

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

,其功能更像您在问题的第二部分中所寻找的,但您不需要执行
“”+
部分。

当您调用System.out.println(char[]数组)时,PrintStream类写入char(它的一个重载处理作业)

但是对于第二种情况,java通过调用其toString方法将char数组转换为string,该方法是一种常规数组toString方法。并将其与空字符串连接,您将收到数组签名[C*…这是一种预期的正常行为

编辑 以下是调用“System.out.println(c)”时最终调用的PrintStream代码:

private void write(char buf[]{
试一试{
已同步(此){
重新打开();
textOut.write(buf);
textOut.flushBuffer();
charOut.flushBuffer();
如果(自动刷新){
对于(int i=0;i
一个调用是
PrintStream.println(char[])
另一个调用是
PrintStream.println(String)

这是因为JVM首先计算
“”+c
。这是通过计算
“”+c.toString()
来完成的,它与
c.toString()
相同

因此,您的通话相当于:

System.out.println(c);
System.out.println(c.toString());
这两个调用是不同的。

解决方案是使用:

“+
确实是假的,应该删除

下面是你得到你得到的东西的原因


System.out
是一个函数。
println()
具有以下重载:

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


“”+c
是字符串串联,定义如下:

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

并说:

[…]转换是通过调用引用对象的toString方法来执行的,没有参数[…]

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

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

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

这就是为什么会出现类似
[C@659e0bfd
当您进行字符串连接时。

字符数组可以直接输出,因为它会坚持输出,直到值为null
而字符数组不能使用toString()的方式,因为它只会获取内存位置,因此您可以创建新字符串(字符数组)以上所有这些都是很好的解决方案和解释。不过,还有另一种方法可以“绕过”这个问题:

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

System.out.print("");
System.out.print(c);
这样,它们将在同一行上(b/c打印不使用换行符转到下一行),并且您不必处理由于字符串连接而产生的任何复杂问题

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

公共作废打印(字符[]s)

打印字符数组。字符根据平台的默认字符编码转换为字节,这些字节完全按照写入(int)方法写入

最简单的形式是

Arrays.toString(c);
如果是2D数组,则使用deepToString,如下所示:

Arrays.deppToString(twoDArray);

newstring(c)
比循环
String=String+String
要快得多,这是增量构建字符串的最糟糕的方式。注意,当从字符数组转换为字符串时,只需执行
String my_String=newstring(char_array);
(即前面没有“+”)@RobHoff你认为答案中的这句话是什么意思?“
”+
确实是假的,应该删除。”
Arrays.toString(c);
Arrays.deppToString(twoDArray);