Java 区分大小写的字符串排序是否损坏?

Is Java case-sensitive string sorting broken?

我尝试对 Java 中的一些字符串进行区分大小写的排序,我对结果感到非常惊讶。这是代码:

List<String> words = List.of("aLocalized", "aaLocalized", "aaaLocalized", "ALocalized", "AALocalized", "AAALocalized");
System.out.println(words.stream().sorted().collect(Collectors.joining(" ")));

结果如下: AAALocalized AALocalized ALocalized aLocalized aaLocalized aaaLocalized

对我来说这看起来不对。为什么小写字母 a 出现在 aa 之前,而 aa 出现在 aaa 之前,而大写字母 AAA 出现在 AA 和 [=17 之前=] 出现在 A?

之前

您可能没有意识到,所有大写字母都在小写字母之前。所以 List.of("A", "a", "B", "b", "C", "c"); 会导致 A B C a b c

它们按每个字符的数字代码点排序。

字符串中的每个字符都有一个数字代码点,由 Unicode 规范指定。 Unicode 的前 128 个代码点的排序称为 ASCII。正如您在 table 中看到的那样,大写字母的代码点编号低于小写字符,因此在排序时大写字母始终排在小写字母之前。

例如,A 是代码点 41(十六进制),而 a 是 61。因此 A 出现在 a 之前。

如果您希望字符串按字典顺序排序,请使用 Collator:

System.out.println(
    words.stream().sorted(Collator.getInstance())
        .collect(Collectors.joining(" ")));