【问题标题】:String equalsIgnoreCase() vs JDK 7 Objects.equals(Object, Object)字符串 equalsIgnoreCase() 与 JDK 7 Objects.equals(Object, Object)
【发布时间】:2015-10-28 07:13:10
【问题描述】:

替换以下内容是否会丢失任何东西:

    public final boolean testEquals(String left, String right) {
        if ((left == null && right != null) || (left != null && right == null)) {
            return false;
        } else if (left == null && right == null) {
            return true;
        } else {
            return left.equalsIgnoreCase(right);
        }
    }

来自 JDK 7 Objects class:

    public final boolean testEquals(String left, String right) {
        return Objects.equals(left,right);
    }

如果我失去了不区分大小写,则将其替换为

Objects.equals(left.toLowerCase(),right.toLowerCase()); 

够了吗?有意义吗?

【问题讨论】:

  • 较新的方式肯定清晰很多。
  • 在第一种情况下,处理 null 情况,但在第三种情况下,left.toLowerCase()right.toLowerCase() 可能会引发 NullPointerException
  • @Kayaman 更清楚,因为缺少null 检查。最后它会类似于第一种方法。
  • @BackSlash 你说得对,我错过了 equalsIgnoreCase。
  • 我认为testEquals 相当于return left == null ? right == null : left.equalsIgnoreCase(right)

标签: java string object equals


【解决方案1】:

方法String.equalsIgnoreCase(String)“不幸的是”稍微复杂一点。您可以查看代码,但在the javadoc itself中有很好的解释:

将此字符串与另一个字符串进行比较,忽略大小写。 如果两个字符串相同,则认为它们相等,忽略大小写 两个字符串中的长度和对应的字符相等 忽略大小写。

两个字符 c1 和 c2 被认为是相同的忽略大小写,如果 以下至少一项是正确的:

  • 这两个字符相同(通过 == 运算符比较)
  • 对每个字符应用 Character.toUpperCase(char) 方法会产生相同的结果
  • 对每个字符应用 Character.toLowerCase(char) 方法会产生相同的结果

【讨论】:

    【解决方案2】:

    如果你不仅限于JDK,你可以使用

    StringUtils.equalsIgnoreCase(CharSequence str1, CharSequence str2)

    来自apache-commons lang,它是 null 安全的并且会返回

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

    【讨论】:

    • 如果您无权访问 apache-commons_lang 库,您可以复制 Object.equals 函数,即left == right || (left != null && left.equalsIgnoreCase(right))
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2013-01-13
    • 2013-12-24
    • 1970-01-01
    • 2021-06-01
    • 2021-11-15
    相关资源
    最近更新 更多