【问题标题】:Why does String.equalsIgnoreCase compare both upper-, AND lower-case versions of individual characters? [duplicate]为什么 String.equalsIgnoreCase 比较单个字符的大写和小写版本? [复制]
【发布时间】:2014-10-20 22:03:42
【问题描述】:

我正在研究 Java SE7 String 类的反编译源,特别是在 equalsIgnoreCase 方法中,令我感到奇怪的是以下行(在 while 循环中执行,省略了本地变量):

if (((c1 = this.value[(o1++)]) != (c2 = target[(o2++)])) 
    && (toUpperCase(c1) != toUpperCase(c2)) 
    && (toLowerCase(c1) != toLowerCase(c2))) { 
        return false; 
}

我想知道为什么要检查 c1 和 c2 的大小写形式是否不相等。当然,如果大写比较相等,甚至永远不会达到小写......但是,我被引导相信有些情况下大写(c1)!=大写(c2)并且字符仍然相等小写比较。

有人建议吗?

【问题讨论】:

  • 会不会是一些非拉丁字符比较大小写相等,反之亦然?无论如何,这是个好问题。
  • @Mena - 实际上并不好。 1)它是重复的。 2)答案在源代码cmets中,源代码可以从很多地方免费获得。
  • @StephenC 哎呀。应该做我的功课。

标签: java string comparison uppercase lowercase


【解决方案1】:

来自this link 似乎有一些大写和小写不匹配的语言环境。使用的示例是土耳其语,其中

if (x.toLowerCase().equals("list"))

x="LIST" 不会返回 true。

我怀疑有几种这样的情况,因此可以选择指定似乎可能会产生很多其他问题的语言环境,或者比较两种情况。所以基本上有一些例子,其中字母在一种情况下可以相同,而在另一种情况下则不同

【讨论】:

    【解决方案2】:

    equalsIgnoreCase的真实Java源码如下:

    public boolean equalsIgnoreCase(String anotherString) {
        return (this == anotherString) ? true
                : (anotherString != null)
                && (anotherString.value.length == value.length)
                && regionMatches(true, 0, anotherString, 0, value.length);
    }
    

    你说的代码在regionMatches,这里是相关部分,完整的原始cmets:

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

    课程:当实际源代码免费提供时,不要浪费时间查看反编译的代码……就像 Java 库一样。事实上,只要我记得寻找 Java 库的源代码,它就已经包含在 JDK 中了。

    参考文献:

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2011-10-06
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多