对CaseInsensitiveComparator的实现感到好奇

当我检查CaseInsensitiveComparator的实现时,它是String私有内部类,我发现了奇怪的事情。

 private static class CaseInsensitiveComparator implements Comparator, java.io.Serializable { ... public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } } return n1 - n2; } ... } 

我很好奇的是:在for循环中,一旦你比较上面的套管字符,为什么你应该再次比较下套管字符? 当Character.toUpperCase(c1)Character.toUpperCase(c2)不同时, Character.toLowerCase(c1)Character.toLowerCase(c2)是否可能相等?

难道不能像这样简化吗?

 public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } return n1 - n2; } 

我错过了什么?

Unicode字符的大小写不同,但大写forms相同。 例如希腊字母Sigma – 它有两个小写forms(σ和ς仅用于单词的末尾),但只有一个大写forms(Σ)。

我找不到任何相反的例子,但如果将来发生这种情况,那么当前的Java实现已经为此做好了准备。 您的Comparator版本肯定会正确处理Sigma案例。

您可以在Unicode网站上的案例映射常见问题解答中找到更多信息。