Java:带有char数组的println给出了乱码

ste*_*ade 26 java arrays char output

这是问题所在.这段代码:

String a = "0000";
 System.out.println(a);
char[] b = a.toCharArray();
 System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

回报

0000
0000


但是这段代码:

String a = "0000";
 System.out.println("String a: " + a);
char[] b = a.toCharArray();
 System.out.println("char[] b: " + b);
Run Code Online (Sandbox Code Playgroud)

回报

String a: 0000
char[] b: [C@56e5b723


世界上到底发生了什么?似乎应该有一个简单的解决方案,但我似乎无法弄明白.

Dou*_*rop 29

当你说

System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

它会导致打电话给print(char[] s)那时println()

JavaDoc print(char[] s)表示:

打印一个字符数组.根据平台的默认字符编码将字符转换为字节,这些字节的写入方式与write(int)方法完全相同.

因此它执行逐字节打印输出.

当你说

System.out.println("char[] b: " + b);
Run Code Online (Sandbox Code Playgroud)

这导致了一个呼叫print(String),所以你实际上做的是附加到String一个Object它调用toString()Object-这一点,因为所有的Object默认,而在一个的情况下Array,打印的参考值(内存地址).

你可以这样做:

System.out.println("char[] b: " + new String(b));
Run Code Online (Sandbox Code Playgroud)

请注意,这是"错误的",因为您没有考虑编码并使用系统默认值.尽快了解编码.


sha*_*zin 5

System.out.println("char[] b: " + Arrays.toString(b));
Run Code Online (Sandbox Code Playgroud)

你得到的乱码是类名后跟对象的内存地址。尝试在 b 后附加字符串时出现问题char[] b:在这种情况下,因此调用 char 数组 b.toString() 方法,因此 [C@56e5b723 被打印。

[ 表示是数组 C 表示本例中的类 char @56e5b723 表示内存位置

  • 不,它是对象的 hashCode()。对于 char 数组,它恰好是内部地址,但不能保证其他对象也是如此,尤其是当它们覆盖 hashCode() 方法时。 (2认同)

小智 5

System.out.println("char[] b: " + b);
Run Code Online (Sandbox Code Playgroud)

这就像

System.out.println(("char[] b: " + b.toString());
Run Code Online (Sandbox Code Playgroud)

你可以查找"Object.toString()"