【问题标题】:Difference between new String(char[]) and char[].toStringnew String(char[]) 和 char[].toString 的区别
【发布时间】:2014-07-14 10:26:33
【问题描述】:

Java 中以下两个代码块的输出不同。我正在尝试了解原因。

private String sortChars(String s){
      char[] arr = s.toCharArray(); //creating new char[]
       Arrays.sort(arr); //sorting that array
        return new String(arr);  
    }

这个返回一个字符串,其中的字符按预期排序。

private String sortChars(String s){
      char[] arr = s.toCharArray(); //creating new char[]
       Arrays.sort(arr); //sorting that array
        return arr.toString();
    }

对不起。我的错! 用于比较两个字符串。 正如许多人所建议的那样,第二个字符串的输出看起来像这样 - [C@2e0ece65

谢谢!

【问题讨论】:

  • 在第二个 sn-p 中,您在从 Object 类继承的数组上调用 toString 方法。
  • 不是反过来吗?即new String(arr) 返回排序后的字符串?
  • 这就是OP所说的:新字符串包含排序值。
  • @ZouZou 这有什么关系?该数组不包含有关其顺序的信息,暗示它是线性的
  • 如果他们真的打印不同的字符序列,我会感到惊讶。

标签: java arrays string char


【解决方案1】:

在 Java 中,数组上的toString 打印[,然后是表示数组元素类型的字符(在本例中为C),然后是标识哈希码。所以在你的情况下,你确定它返回的是原始字符串而不是 [C@f4e6d 之类的东西吗?

无论哪种方式,您都应该使用new String(arr)。这是将char[] 转换回String 的最短、最简洁的方法。你也可以使用Arrays.toString(arr)

相关琐事

您的arr.toString() 方法返回类似于[Cf4e6d 的原因是Object.toString 返回

getClass().getName() + '@' + Integer.toHexString(hashCode())

对于char 数组,getName() 返回字符串[C。对于您的程序,您可以通过代码看到这一点:

System.out.println(arr.getClass().getName());

结果的第二部分,Object.hashCode(),根据对象的内存地址返回一个数字,而不是数组内容。这是因为默认情况下,对象的“等于”定义是引用相等,即两个对象只有在内存中的引用对象相同时才相同。因此,对于基于相同字符串的两个数组,您将获得不同的 arr.toString() 值:

String s = "fdsa";
char[] arr = s.toCharArray();
char[] arr2 = s.toCharArray();
System.out.println(arr.toString());
System.out.println(arr2.toString());

给予:

[C@4b7c8f7f
[C@5eb10190

请注意,这与 String 类不同,其中相等规则被覆盖以使其具有值相等。但是,您应该始终使用string1.equals(string2) 来测试字符串是否相等,而不是==,因为== 方法仍将测试内存位置。

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 2011-04-21
    • 2011-04-23
    • 2012-03-16
    • 2020-01-28
    • 2012-05-12
    • 2021-04-10
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多