CharSequence equals() 方法不起作用

6

这是代码:

if (cs.equals(keywordUnderProcess)) {

} else {

}

cskeywordUnderProcess都是CharSequence,且值为star,但是else分支会执行。为什么?equals检查的是值,不是吗?

enter image description here

enter image description here

3个回答

7
如果您阅读CharSequence接口的javadoc页面,会发现equals方法的行为是未定义的:

该接口不改变equalshashCode方法的一般约定。因此,在比较实现CharSequence接口的两个对象时,其结果通常是未定义的。每个对象可能由不同的类实现,并且不能保证每个类都能够测试其实例是否与另一个相等。因此,使用任意CharSequence实例作为集合中的元素或映射中的键是不合适的。


不要因为抽象方法的实现不好(除非它有一个默认方法,你可以责备它)而责怪接口。一般来说,不要责怪标准API。如果它“工作不好”,问题通常在于使用它的方式,而不是API本身。 - Lew Bloch
我不确定你是怎么得出我在责备接口的印象的。我只是陈述了开发人员从文档中注意到的事实。 - Matthew Diana
你知道一个简单的解决方法来比较CharSequence吗?或者将其转换为String,使用String的equal方法? - János
是的,那就是解决方法。对它们中的每个对象都调用 toString 方法。 - Louis Wasserman

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

0

如果其中一个操作数是String,则可以使用String#contentEquals。如果不是,则可以先在其中一个上调用toString()

过去,我在调试字符串相等性问题时浪费了很多时间,而且我对API参考中的解释并不满意。从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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接