用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);