如果我正常地打印出字符数组
char[] c = new char[]{'3','b','o'};
System.out.println(c); //prints 3bo
输出结果为字符串。然而,如果我连接一个字符串,它会打印数组的内存位置。
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
,则在运行时对另一个操作数进行字符串转换(§5.1.11)。
[...] 转换被视为使用无参的被引用对象的
toString方法
进行调用 [...]
toString()
未定义为数组,因此调用Object.toString()
方法:
类
Object
的toString
方法返回由以下内容组成的字符串:该对象是一个实例的类的名称,字符'@
',以及对象的哈希码的无符号十六进制表示。换句话说,此方法返回与以下值相等的字符串:这就是为什么进行字符串拼接时会得到类似于
getClass().getName() + '@' + Integer.toHexString(hashCode())
[C@659e0bfd
这样的结果。
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;
}
}
最简单的形式是:
Arrays.toString(c);
Arrays.deepToString
:Arrays.deepToString(twoDArray);
一个调用是PrintStream.println(char[])
,另一个调用是PrintStream.println(String)
。
这是因为JVM首先评估"" + c
。这是通过评估"" + c.toString()
来完成的,这与c.toString()
完全相同。
因此,您的调用等效于:
System.out.println(c);
System.out.println(c.toString());
这两个调用是不同的。
以上所有的解决方案和解释都很好。然而,还有另一种“绕过”这个问题的方法:
你可以使用两个打印语句,更具体地说,
System.out.print("");
System.out.print(c);
这样它们将在同一行上(因为print不使用换行符转到下一行),您就不必处理由于字符串连接而引起的任何复杂性。
更多信息,请参见 Oracle的Print Stream文档。以下是当char[]作为参数传递给print时的文档部分:
public void print(char[] s)
打印字符数组。根据平台的默认字符编码将字符转换为字节,并以与write(int)方法完全相同的方式编写这些字节。
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
。
字符数组可以直接输出,因为它会一直输出直到值为null。 而字符数组不能使用toString()方法,因为它只会获取内存位置,所以你需要使用new String(字符数组)
String my_string = new String(char_array);
即可(即不需要在前面加上"" +)。 - Rob Hoff"" +
真的很虚假,应该被删除。” - Andreas