【问题标题】:CharSequence equals() does not work wellCharSequence equals() 不能正常工作
【发布时间】:2017-01-25 06:11:36
【问题描述】:

有这个代码:

if (cs.equals(keywordUnderProcess)) {

} else {

}

cskeywordUnderProcess 都是 CharSequence,具有值 star,但 else 情况将执行。为什么? equals检查值,不是吗?

【问题讨论】:

    标签: java string character


    【解决方案1】:

    如果您阅读 CharSequence 接口的 javadoc 页面,它会说 equals 的行为未定义:

    这个接口没有细化 equals 和 hashCode 方法的一般合约。因此,比较实现 CharSequence 的两个对象的结果通常是未定义的。每个对象都可以由不同的类实现,并且不能保证每个类都能够测试其实例与其他类的实例是否相等。因此,将任意 CharSequence 实例用作集合中的元素或映射中的键是不合适的。

    【讨论】:

    • 不要因为抽象方法的错误实现而责备接口(除非它有你责备的默认方法)。一般来说,不要责怪标准 API。如果它“不能很好地工作”,问题通常出在它的使用上,而不是 API 本身。
    • 我不知道你是如何得到我在指责界面的印象。我只是陈述开发人员从文档中注意到的一个事实。
    • 您知道比较CharSequences 的简单解决方法吗?或者转换成String,并使用equalString
    • 是的,这就是解决方法。对它们中的每一个调用 toString。
    【解决方案2】:

    如果操作数之一是String,您可以使用String#contentEquals。如果没有,您可以先拨打其中一个电话toString()

    过去,我在调试字符串相等问题时浪费了几个小时,我对API reference 中的理由不满意。从 Java 8 开始,CharSequence 可以定义如下,以允许比较任意的CharSequence。然后类可以覆盖equals(CharSequence) 的默认实现以提高性能,就像StringcontentEquals() 中所做的那样。

    public interface CharSequence {
        int length();
        char charAt(int index);
        CharSequence subSequence(int start, int end);
        
        default boolean equals(CharSequence s) {
            if (s == null || length() != s.length())
                return false;
            for (int i = 0; i < length(); i++)
                if (charAt(i) != s.charAt(i))
                    return false;
            return true;
        }
    }
    

    【讨论】:

      【解决方案3】:

      自 Java 11(2018 年 9 月发布)以来,有一个静态方法 CharSequence.compare,因此您可以使用 if (CharSequence.compare(cs, keywordUnderProcess) == 0) 来比较两个 CharSequence-s 是否相等。

      【讨论】:

        猜你喜欢
        • 2015-02-20
        • 2017-12-25
        • 2013-03-30
        • 2010-11-30
        • 2021-10-02
        • 2017-08-06
        • 2013-11-22
        • 1970-01-01
        • 2013-09-10
        相关资源
        最近更新 更多