equals
方法的行为是未定义的:
该接口不改变
equals
和hashCode
方法的一般约定。因此,在比较实现CharSequence接口的两个对象时,其结果通常是未定义的。每个对象可能由不同的类实现,并且不能保证每个类都能够测试其实例是否与另一个相等。因此,使用任意CharSequence实例作为集合中的元素或映射中的键是不合适的。
CharSequence.compare
,因此您可以使用if (CharSequence.compare(cs, keywordUnderProcess) == 0)
来比较两个CharSequence是否相等。如果其中一个操作数是String
,则可以使用String#contentEquals。如果不是,则可以先在其中一个上调用toString()
。
过去,我在调试字符串相等性问题时浪费了很多时间,而且我对API参考中的解释并不满意。从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;
}
}