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

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

String a = "0000"; System.out.println(a); char[] b = a.toCharArray(); System.out.println(b); 

回报

 0000
 0000

但是这段代码:

 String a = "0000"; System.out.println("String a: " + a); char[] b = a.toCharArray(); System.out.println("char[] b: " + b); 

回报

字符串a:0000
 char [] b:[C @ 56e5b723

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

当你说

 System.out.println(b); 

它导致调用print(char[] s)然后println()

用于print(char[] s)的JavaDoc print(char[] s)说:

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

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

当你说

 System.out.println("char[] b: " + b); 

它导致对print(String)的调用,所以你实际上在做的是追加一个String ,它在Object上调用toString() – 这与默认情况下的所有Object ,并且在一个Array ,打印引用的值(内存地址)。

你可以这样做:

 System.out.println("char[] b: " + new String(b)); 

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

 System.out.println("char[] b: " + b); 

这就像

 System.out.println(("char[] b: " + b.toString()); 

你可以查找“Object.toString()”

使用

 System.out.println("char[] b: " + Arrays.toString(b)); 

你得到的gibrish是Class名称,后跟对象的内存地址。 当您尝试使用字符串char[] b:追加b时会出现问题char[] b:在这种情况下,将调用char数组b.toString()方法[C @ 56e5b723。

[表示它是一个数组C表示在这种情况下的类char @ 56e5b723表示内存位置

数组的toString()方法(当你执行"..." + b时调用的方法)仅用于提供调试输出。 没有特殊情况, char[]toString()将为您提供原始字符串 – 所有类型的数组都具有相同的toString()实现。

如果要从char数组中获取原始字符串,请使用:

 String a2 = new String(b); 

使用3:e行!

 Scanner input = new Scanner(System.in); char[] txt = input.next().toCharArray(); System.out.println((char[])txt);