浅谈Java compareTo()和equals()
1、字符串
"str".equals((String)null) // 返回false
"foo".compareTo((String)null) == 0 // NullPointerException
equals
将把任何Object作为参数,但是compareTo
只会使用Strings。
equals
只会告诉你它们是否相等,但compareTo
给出了String如何按照字典顺序进行比较的信息。
2、源码
public boolean equals(Object obj) {
return (this == obj);
}
public int compareTo(String anotherString) {
byte v1[] = value;
byte v2[] = anotherString.value;
if (coder() == anotherString.coder()) {
return isLatin1() ? StringLatin1.compareTo(v1, v2)
: StringUTF16.compareTo(v1, v2);
}
return isLatin1() ? StringLatin1.compareToUTF16(v1, v2)
: StringUTF16.compareToLatin1(v1, v2);
}
3、总结
-
对于
equals
方法,是属于顶级类Object
类的一个方法 -
对于
compareTo
方法,它是接口Comparable
接口的一个方法;除此之外,还有另一个接口Comparator
,里面含有一个方法compare(T a, T b)
; -
compareTo()
方法属于接口Comparable
,因此不是所有的类都拥有该方法,因为有些类根本不具有比较大小的属性; -
compareTo()
的参数不能为null
;而equals()
的参数可以是null
,返回值false
; -
在实现
Comparable
接口的compareTo
方法时,强烈推荐与equals
的结果一致,否则可能会出现一些奇怪的错误;因为有些类是利用equals
来判断重复性,
而有些类是利用自然顺序x.compareTo(y) == 0
来判断,官方文档强烈推荐:(x.compareTo(y)==0) == (x.equals(y))
; -
一般来说,建议使用
"abc".equals(str)
,这样即使str为空也不会报错。
方法 | 说明 |
---|---|
a.equals(b) | 比较 对象a 与b 是否逻辑相等(可以是== 比较),但是也可以重写自定义相等的含义 |
a == b | 操作符,比较俩引用引用的对象是否物理上是同一个对象 |
a.compareTo(b) | 比较对象a 与b 的自然顺序 |
compare(a, b) | 同a.compareTo(b) |