【问题标题】:Java: println with char array gives gibberishJava:带有 char 数组的 println 会产生乱码
【发布时间】:2012-11-10 09:55:05
【问题描述】:

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

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


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

【问题讨论】:

  • 您可以简单地做System.out.println(new String(b)); 使用String 的构造函数之一将char 数组转换为String。

标签: java arrays char output


【解决方案1】:

当你说

System.out.println(b);

这会导致调用print(char[] s),然后调用println()

print(char[] s) 的 JavaDoc 说:

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

所以它会逐字节打印出来。

当你说

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

这会导致调用print(String),因此您实际上要做的是附加到StringObject,它会在Object 上调用toString()——这与所有@ 一样默认情况下为 987654332@,如果是 Array,则打印引用的值(内存地址)。

你可以这样做:

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

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

【讨论】:

  • 我将从这里开始:joelonsoftware.com/articles/Unicode.html - 它的要点是,如果你有一堆二进制数据,你真的需要知道编码才能以文本方式表示它,否则你肯定有异常。
【解决方案2】:

使用

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

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

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

【讨论】:

  • 不,它是对象的 hashCode()。这里对于一个 char 数组,它恰好是内部地址,但对于其他对象,尤其是当它们覆盖 hashCode() 方法时,不能保证是这个。
【解决方案3】:
System.out.println("char[] b: " + b);

这就像

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

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

【讨论】:

    【解决方案4】:

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

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

    String a2 = new String(b);
    

    【讨论】:

      【解决方案5】:

      使用 3:e 行!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 2016-06-26
        相关资源
        最近更新 更多