对大小写不敏感比较器的实现感到好奇
2022-09-02 10:01:06
当我检查的实现时,这是私有的内在类,我发现了奇怪的事情。CaseInsensitiveComparator
String
private static class CaseInsensitiveComparator
implements Comparator<String>, 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;
}
我错过了什么吗?