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