【问题标题】:what is the difference between equals() and equalsIgnoreCase() in StringUtils of commons-lang3-3.6.jar?commons-lang3-3.6.jar 的 StringUtils 中的 equals() 和 equalsIgnoreCase() 有什么区别?
【发布时间】:2018-12-08 19:10:05
【问题描述】:

当我使用这两种方法时,我想知道区别,以及 equalsIgnoreCase() 是如何忽略两个字符串的大小写的。但是我什至没有发现源代码的区别,只是代码的顺序不同。 谁能帮我分析一下源码的区别,怎么忽略大小写的?谢谢。 这是源代码:

public static boolean equals(CharSequence cs1, CharSequence cs2) {
    if (cs1 == cs2) {
        return true;
    } else if (cs1 != null && cs2 != null) {
        if (cs1.length() != cs2.length()) {
            return false;
        } else {
            return cs1 instanceof String && cs2 instanceof String ? cs1.equals(cs2) : CharSequenceUtils.regionMatches(cs1, false, 0, cs2, 0, cs1.length());
        }
    } else {
        return false;
    }
}

public static boolean equalsIgnoreCase(CharSequence str1, CharSequence str2) {
    if (str1 != null && str2 != null) {
        if (str1 == str2) {
            return true;
        } else {
            return str1.length() != str2.length() ? false : CharSequenceUtils.regionMatches(str1, true, 0, str2, 0, str1.length());
        }
    } else {
        return str1 == str2;
    }
}

【问题讨论】:

  • regionMatches 的调用肯定不一样。

标签: java equals apache-commons-lang3


【解决方案1】:

区别在于方法 CharSequenceUtils.regionMatches 。第二个参数是ignoreCase

static boolean regionMatches(CharSequence cs, boolean ignoreCase, int thisStart,
        CharSequence substring, int start, int length)    {
    if (cs instanceof String && substring instanceof String) {
        return ((String) cs).regionMatches(ignoreCase, thisStart, ((String) substring), start, length);
    } else {
        // TODO: Implement rather than convert to String
        return cs.toString().regionMatches(ignoreCase, thisStart, substring.toString(), start, length);
    }
}

【讨论】:

    【解决方案2】:

    equalsIgnoreCase 执行以下测试:

    1. 任一字符串是否为空?如果是,请返回str1 == str2
    2. str1 == str2 吗?如果是,则返回 true
    3. 字符串的长度是否不同?如果是,则返回 false
    4. 使用CharSequenceUtilsregionMatches方法比较两者,第二个参数ignoreCase设置为true

    你可以找到regionMatcheshere的源代码。如果 ignoreCase 设置为 true,则该函数在比较字符时似乎会将字符大写。

    相比之下,equals 调用 regionMatches 并为 ignoreCase 参数设置 false,这将导致 regionMatches 不大写字符。

    【讨论】:

      【解决方案3】:

      equalsIgnoreCase(...) 忽略大小写(UPPER CASER o 小写)。 . 这样

      "HELLO".equalsIgnoreCase("hello")
      

      是真的。

      【讨论】:

      • 该问题专门询问apache-commons-lang3的行为。
      【解决方案4】:

      在 equals 中你会看到字符串相等:示例:

       StringUtils.equals("abc", "abc") = true
       StringUtils.equals("abc", "ABC") = false
      

      在 equalsIgnoreCase 中,顾名思义,尝试比较字符串相等性忽略大小写:

       StringUtils.equalsIgnoreCase("abc", "abc") = true
       StringUtils.equalsIgnoreCase("abc", "ABC") = true 
      

      From Apache Doc.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-04
        • 2018-05-02
        • 2016-05-17
        • 2018-04-03
        • 2022-12-04
        • 2011-11-23
        • 2011-12-02
        相关资源
        最近更新 更多