27

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

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
字符 [] b: [C@56e5b723


世界上到底发生了什么?似乎应该有一个足够简单的解决方案,但我似乎无法弄清楚。

4

5 回答 5

31

当你说

System.out.println(b);

它导致调用print(char[] s)thenprintln()

JavaDocprint(char[] s)说:

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

所以它执行一个字节一个字节的打印输出。

当你说

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

它导致对 的调用print(String),因此您实际上正在做的是附加到Stringan上Object调用-- this 与所有默认情况一样,并且在 an 的情况下,打印引用的值(内存地址)。toString()ObjectObjectArray

你可以这样做:

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

请注意,这是“错误的”,因为您不关心编码并且使用系统默认值。尽早了解编码。

于 2012-11-22T03:01:32.207 回答
5

采用

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

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

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

于 2012-11-22T02:58:30.133 回答
5
System.out.println("char[] b: " + b);

这就像

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

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

于 2012-11-22T03:02:46.717 回答
4

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

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

String a2 = new String(b);
于 2012-11-22T03:02:14.560 回答
2

使用 3:e 行!

Scanner input = new Scanner(System.in);
char[] txt = input.next().toCharArray();
System.out.println((char[])txt);
于 2016-04-26T06:56:38.437 回答