equalsIgnoreCase不符合javadoc?

时间:2014-01-14 22:24:49

标签: java

String.equalsIgnoreCase的javadoc说:

  

如果两个字符串具有相同的长度并且两个字符串中的相应字符等于忽略大小写,则认为它们是相等的忽略大小写。   如果至少满足下列条件之一,则两个字符c1和c2被认为是相同的忽略情况:

     

两个字符相同(通过==运算符进行比较)

     

将Character.toUpperCase(char)方法应用于每个字符会产生相同的结果

     

将Character.toLowerCase(char)方法应用于每个字符会产生相同的结果

那么有人能解释一下吗?

public class Test
{
    private static void testChars(char ch1, char ch2) {
        boolean b1 = (ch1 == ch2 ||
                   Character.toLowerCase(ch1) == Character.toLowerCase(ch2) ||
                   Character.toUpperCase(ch1) == Character.toUpperCase(ch2));
        System.out.println("Characters match: " + b1);

        String s1 = Character.toString(ch1);
        String s2 = Character.toString(ch2);
        boolean b2 = s1.equalsIgnoreCase(s2);
        System.out.println("equalsIgnoreCase returns: " + b2);
    }

    public static void main(String args[]) {
        testChars((char)0x0130, (char)0x0131);
        testChars((char)0x03d1, (char)0x03f4);
    }
}

输出:

Characters match: false
equalsIgnoreCase returns: true
Characters match: false
equalsIgnoreCase returns: true

2 个答案:

答案 0 :(得分:3)

这些角色对大写和小写的定义可能是特定于语言环境的。来自Character.toLowerCase()的JavaDoc:

  

通常,String.toLowerCase()应该用于将字符映射到   小写。字符串大小写映射方法有几个好处   字符大小写映射方法。字符串案例映射方法可以   执行区域设置敏感的映射,上下文相关的映射和1:M   字符映射,而字符大小写映射方法不能。

如果查看String.toLowerCase()方法,您会发现它已被覆盖以接受Locale对象。这将执行特定于语言环境的大小写转换。

编辑:我想明确是的,String.equalsIgnoreCase()的JavaDoc说出了它的内容,但这是错误的。它并非在所有情况下都是正确的,例如,当然不适用于具有代理项的字符,也适用于区域设置定义大写/小写字符的字符。

答案 1 :(得分:2)

我在String.java中找到了这个(此代码段也在peter.petrov链接到的文档中):

        if (ignoreCase) {
            // If characters don't match but case may be ignored,
            // try converting both characters to uppercase.
            // If the results match, then the comparison scan should
            // continue.
            char u1 = Character.toUpperCase(c1);
            char u2 = Character.toUpperCase(c2);
            if (u1 == u2) {
                continue;
            }
            // Unfortunately, conversion to uppercase does not work properly
            // for the Georgian alphabet, which has strange rules about case
            // conversion.  So we need to make one last check before
            // exiting.
            if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
                continue;
            }
        }

equalsIgnoreCase使用它。有趣的是,如果它遵循javadoc所说的,那么底线就应该是

            if (Character.toLowerCase(c1) == Character.toLowerCase(c2)) {

使用c1c2代替u1u2。这会影响这两种情况的结果。我们都同意javadoc是“错误的”,因为它并没有真正反映出案例折叠应该如何运作;但是上面的逻辑并没有更好地处理正确的案例折叠,并且它不符合文档。