Java 字符数组的数组排序错误行为

Java 字符数组的数组排序错误行为,java,Java,输出: String s5 = "peek"; int i[] = {12, 25, 7, 3, 45}; Arrays.sort(i); for(int x : i) { System.out.print(x + ","); } Arrays.sort(s5.toCharArray()); System.out.println(s5); // expected here eekp, but showing peek for(char c :

输出:

String s5 = "peek";
int i[] = {12, 25, 7, 3, 45};
Arrays.sort(i);

for(int x : i) {
  System.out.print(x + ",");
}

Arrays.sort(s5.toCharArray());

System.out.println(s5); // expected here eekp, but showing peek

for(char c : s5.toCharArray()) {
  System.out.print(c + ",");  //expected here e,e,k,p , but showing p,e,e,k
}
对于行
System.out.println(s5)
我预期为“eekp”,但它显示为“peek”

对于行
System.out.print(c+“,”)
我期望是“e,e,k,p”,但它显示的是“p,e,e,k”

数组排序似乎适用于整数,但不适用于字符数组,似乎我做错了什么。您能告诉我吗?

更改
数组.sort(s5.tocharray())
char[]s6=s5.toCharArray()):数组.排序(s6)

然后打印s6的值

toCharArray()从源代码中提供一个新数组,但不修改源代码。打印时,您打印的是源数组,而不是包含已排序字符的数组

更改
Arrays.sort(s5.tocharray())
char[]s6=s5.toCharArray()):数组.排序(s6)

然后打印s6的值

toCharArray()从源代码中提供一个新数组,但不修改源代码。打印时打印的是源数组,而不是包含排序字符的数组

字符串是不可变的(大部分)
Arrays.sort(s5.toCharArray())

上述操作对字符数组的副本进行排序,并且不会修改实际的字符串值数组

JDK 1.8中
toCharArray
的内部代码

char result[]=新字符[value.length];
数组复制(值,0,结果,0,值,长度);
存储副本并对其排序(引用中的新对象)
char[]copy=s5.toCharArray();
数组。排序(复制);
除非是为了好玩,否则不要尝试
Field-Field=String.class.getDeclaredField(“值”);
字段。setAccessible(true);
字符串s5=“peek”;
Arrays.sort((char[])field.get(s5));
系统输出打印LN(s5);
字符串是不可变的(大部分)
Arrays.sort(s5.toCharArray())

上述操作对字符数组的副本进行排序,并且不会修改实际的字符串值数组

JDK 1.8中
toCharArray
的内部代码

char result[]=新字符[value.length];
数组复制(值,0,结果,0,值,长度);
存储副本并对其排序(引用中的新对象)
char[]copy=s5.toCharArray();
数组。排序(复制);
除非是为了好玩,否则不要尝试
Field-Field=String.class.getDeclaredField(“值”);
字段。setAccessible(true);
字符串s5=“peek”;
Arrays.sort((char[])field.get(s5));
系统输出打印LN(s5);
正确无误。您的代码将在排序后立即丢弃新创建的数组。您将一个新的匿名数组传递给
Arrays.sort
,后者对新数组进行了排序,然后新数组超出了范围,因为您忽略了将数组放入变量中

此外,我可以使用Unicode代码点而不是
char
显示代码

Unicode代码点编号 Java中的
char
类型已过时,甚至无法表示Unicode中定义的一半字符。相反,您应该使用代码点编号,即在Unicode标准中为每个字符分配一个编号

您可以通过调用获取这些整数代码点编号的流()

下面是一些示例代码。作为输入,我们使用一个包含两个表情符号的字符串。使用
char
type,我们错误地看到了四个
,其中我们期望两个字符的数字。然后我们使用代码点,我们正确地看到这对表情符号的一对数字(128075128506)。最后,我们使用Java streams对代码点编号进行排序,并收集排序后的编号以构建一个新的
String
对象

String input=“正确。排序后,您的代码将立即丢弃新创建的数组。您将一个新的匿名数组传递给了
Arrays.sort
,它对新数组进行了排序,然后新数组超出了范围,因为您忽略了将数组放入变量中

此外,我可以使用Unicode代码点而不是
char
显示代码

Unicode代码点编号 Java中的
char
类型已过时,甚至无法表示Unicode中定义的一半字符。相反,您应该使用代码点号,Unicode标准中为每个字符分配一个数字

您可以通过调用获取这些整数代码点编号的流()

下面是一些示例代码。作为输入,我们使用一个包含两个表情符号的字符串。使用
char
type,我们错误地看到四个
,其中我们期望两个字符数字。然后我们使用代码点,我们正确地看到一对数字(128075128506)最后,我们使用Java streams对代码点编号进行排序,并收集排序后的编号以构建一个新的
String
对象


String input=“每次调用
toCharArray
都会得到一个新的字符数组,其中包含字符串内容的副本。实际上不能更改字符串的内容。字符串是不可变的。嗨,在对char数组进行排序之后,可以使用排序后的值创建一个新字符串<代码>字符[]字符=s5.toCharArray();数组。排序(字符);字符串newString=新字符串(字符)提示:
s5.ToCharArray()
返回什么?特别是:通读:它做什么?这与您假设的有什么不同?每次调用
toCharArray
都会得到一个新的字符数组,其中包含字符串内容的副本。实际上不能更改字符串的内容。字符串是不可变的。嗨,在对char数组进行排序之后,可以使用排序后的值创建一个新字符串<代码>字符[]字符=s5.toCharArray();数组。排序(字符);字符串newString=新字符串(字符)提示:
s5.ToCharArray()
返回什么?特别是:通读:它做什么?这与您的假设有什么不同?而且,重要的是,Java
String
s是不可变的。没有其他方法可以重新排序t
3,7,12,25,45,peek
p,e,e,k,