CharSequence equals() 不能正常工作

Posted

技术标签:

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

有这个代码:

if (cs.equals(keywordUnderProcess)) 

 else 


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

【问题讨论】:

【参考方案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 是否相等。

【讨论】:

以上是关于CharSequence equals() 不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

项目中遇到的问题 TextView和EditText的gettext()方法如何判断取得空值

StringStringBufferStringBuilder之间的区别

StringStringBufferStringBuilder之间的区别

04-String课后动手动脑

如何将字符串转换为 CharSequence?

Java中替换字符串的方法