【发布时间】:2017-01-25 06:11:36
【问题描述】:
有这个代码:
if (cs.equals(keywordUnderProcess)) {
} else {
}
cs 和 keywordUnderProcess 都是 CharSequence,具有值 star,但 else 情况将执行。为什么? equals检查值,不是吗?
【问题讨论】:
有这个代码:
if (cs.equals(keywordUnderProcess)) {
} else {
}
cs 和 keywordUnderProcess 都是 CharSequence,具有值 star,但 else 情况将执行。为什么? equals检查值,不是吗?
【问题讨论】:
如果您阅读 CharSequence 接口的 javadoc 页面,它会说 equals 的行为未定义:
这个接口没有细化 equals 和 hashCode 方法的一般合约。因此,比较实现 CharSequence 的两个对象的结果通常是未定义的。每个对象都可以由不同的类实现,并且不能保证每个类都能够测试其实例与其他类的实例是否相等。因此,将任意 CharSequence 实例用作集合中的元素或映射中的键是不合适的。
【讨论】:
CharSequences 的简单解决方法吗?或者转换成String,并使用equal的String?
如果操作数之一是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;
}
}
【讨论】:
自 Java 11(2018 年 9 月发布)以来,有一个静态方法 CharSequence.compare,因此您可以使用 if (CharSequence.compare(cs, keywordUnderProcess) == 0) 来比较两个 CharSequence-s 是否相等。
【讨论】: