新 String(char[]) 和 char[].toString 的区别

6
以下两个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();
    }

抱歉,是我的错! 使用 "equals" 方法来比较两个字符串。 像许多人建议的那样,第二个字符串的输出结果看起来是这样的 - [C@2e0ece65 谢谢!

在第二个片段中,您正在调用从Object类继承的数组上的toString方法。 - Alexis C.
难道不是反过来吗?也就是说,new String(arr) 返回排序后的字符串? - user184994
这是OP所述的:新字符串包含排序值。 - jordan
如果他们真的打印出不同的字符序列,我会感到惊讶。 - jordan
你确定 arr.toString(); 会打印字符串吗?我认为正常的Java行为是先打印数组标识符 [,然后是元素类型,最后是哈希码。 - Andy Brown
显示剩余3条评论
1个回答

13
在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。您可以使用以下代码在程序中查看:

char[] array = new char[10];

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

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

结果的第二部分,Object.hashCode(),返回一个基于对象内存地址而非数组内容的数字。这是因为默认情况下,对象的“equals”定义是引用相等性,即只有当它们是内存中相同的引用对象时,两个对象才相同。因此,对于基于相同字符串的两个数组,您将获得不同的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)来测试字符串相等性,而不是使用==,因为==方法仍会测试内存位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接