Curious über die Implementierung von CaseInsensitiveComparator [duplicate]

Diese Frage hat hier bereits eine Antwort:

Logik in CaseInsensitiveComparator verstehen 5 Antworten

Während ich die Implementierung von @ überprüCaseInsensitiveComparator, das ist die private innere Klasse vonString, Ich fand seltsame Sache.

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;
    }
    ...
}

Was ich neugierig bin ist das: In derfor loop, wenn Sie die Zeichen in Großbuchstaben vergleichen, warum sollten Sie die Zeichen in Kleinbuchstaben erneut vergleichen? WannCharacter.toUpperCase(c1) undCharacter.toUpperCase(c2) sind anders, ist es möglich, dassCharacter.toLowerCase(c1) undCharacter.toLowerCase(c2) sind gleich

Könnte es nicht so vereinfacht werden?

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;
}

Habe ich etwas verpasst

Antworten auf die Frage(2)

Ihre Antwort auf die Frage