在 Java 中打印字符数组

新手上路,请多包涵

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

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

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

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

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

原文由 Toby L. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 479
2 个回答

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

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

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

下面是为什么你得到你得到的。


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

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


"" + c 是 _字符串连接_,在 JLS 15.18.1 String Concatenation Operator中定义 +

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

JLS 5.1.11 字符串转换 说:

[…] 转换就像 调用不带参数的引用对象的 toString 方法 一样执行 […]

toString() 没有为数组定义,所以调用了 Object.toString() 方法:

toString 类的方法 Object 返回一个字符串,该字符串包含对象是其实例 的类的名称, 符号 字符 ‘ @ ‘351f7fc80d-c47 , 以及对象 哈希码 的无符号十六进制表示。换句话说,此方法返回一个等于以下值的字符串:

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

这就是为什么在进行字符串连接时会得到类似 [C@659e0bfd 的原因。

原文由 Andreas 发布,翻译遵循 CC BY-SA 4.0 许可协议

最简单的形式是:

 Arrays.toString(c);

如果它是二维数组,则使用 Arrays.deepToString 如下:

 Arrays.deepToString(twoDArray);

原文由 KayV 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题