Java:为什么String.compareIgnoreCase()使用Character.toUpperCase()和Character.toLowerCase()?

Sen*_*ram 6 java

Class 的compareToIgnoreCase方法String是使用下面的代码段(jdk1.8.0_45)中的方法实现的.

一世.为什么都Character.toUpperCase(char)Character.toLowerCase(char)用于比较?它们中的任何一个都不足以达到比较的目的吗?

II.为什么s1.toLowerCase().compare(s2.toLowerCase())不习惯实施compareToIgnoreCase? - 我理解可以用不同的方式实现相同的逻辑.但是,我仍然想知道是否有特定的理由选择一个而不是另一个.

    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;
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*INO 6

有些语言具有特殊字符,可以转换为上部或下部字符(或字符序列).

因此,仅使用一个案例可能会对这种特殊字符产生一些问题.

例如,德语中的Eszettß字符以大写字母转换为SS.来自维基百科:

eszett这个名字来自两个字母S和Z,因为它们用德语发音.它的Unicode编码是U + 00DF.

因此,如果只使用较低的比较,像groß这样的词与粗略相比会产生失败.


@chrylis这是一个有效的例子

    System.out.println("ß".toUpperCase().equals("SS"));  // True
    System.out.println("ß".toLowerCase().equals("ss"));  // false
Run Code Online (Sandbox Code Playgroud)

感谢@chrylis的评论我做了一些额外的测试,我在String类上发现了一个可能的错误:

    System.out.println("ß".toUpperCase().equals("SS"));  // True
    System.out.println("ß".toLowerCase().equals("ss"));  // false

    but

    System.out.println("ß".equalsIgnoreCase("SS"));  // False
    System.out.println("ß".equalsIgnoreCase("ss"));  // False
Run Code Online (Sandbox Code Playgroud)

因此,如果手动转换为大写,则至少存在两个字符串相等的情况,但如果比较忽略大小写则不等于.

  • 这种特殊情况在Java中不起作用,因为`SS`是两个字符. (2认同)

And*_*ner 6

这是使用土耳其语的例子:

System.out.println(Character.toUpperCase('i') == Character.toUpperCase('?'));
System.out.println(Character.toLowerCase('i') == Character.toLowerCase('?'));
Run Code Online (Sandbox Code Playgroud)

第一行打印false; 第二个true.Ideone demo.