CharSequence equals() 不能正常工作
Posted
技术标签:
【中文标题】CharSequence equals() 不能正常工作【英文标题】:CharSequence equals() does not work well 【发布时间】:2017-01-25 06:11:36 【问题描述】:有这个代码:
if (cs.equals(keywordUnderProcess))
else
cs
和 keywordUnderProcess
都是 CharSequence
,具有值 star
,但 else 情况将执行。为什么? equals
检查值,不是吗?
【问题讨论】:
【参考方案1】:如果您阅读 CharSequence 接口的 javadoc 页面,它会说 equals
的行为未定义:
这个接口没有细化 equals 和 hashCode 方法的一般合约。因此,比较实现 CharSequence 的两个对象的结果通常是未定义的。每个对象都可以由不同的类实现,并且不能保证每个类都能够测试其实例与其他类的实例是否相等。因此,将任意 CharSequence 实例用作集合中的元素或映射中的键是不合适的。
【讨论】:
不要因为抽象方法的错误实现而责备接口(除非它有你责备的默认方法)。一般来说,不要责怪标准 API。如果它“不能很好地工作”,问题通常出在它的使用上,而不是 API 本身。 我不知道你是如何得到我在指责界面的印象。我只是陈述开发人员从文档中注意到的一个事实。 您知道比较CharSequence
s 的简单解决方法吗?或者转换成String
,并使用equal
的String
?
是的,这就是解决方法。对它们中的每一个调用 toString。【参考方案2】:
如果操作数之一是String
,您可以使用String#contentEquals。如果没有,您可以先拨打其中一个电话toString()
。
过去,我在调试字符串相等问题时浪费了几个小时,我对API reference 中的理由不满意。从 Java 8 开始,CharSequence 可以定义如下,以允许比较任意的CharSequence
。然后类可以覆盖equals(CharSequence)
的默认实现以提高性能,就像String
在contentEquals()
中所做的那样。
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之间的区别