背景:最近在研究靜態掃描的東西,遇到一個規則:"equals(Object obj)" should be overridden along with the "compareTo(T obj)" method
然后就想深度扒一扒equals和compareTo有什么區別
1.java.lang.Object是所有類的父類,java.lang.String類繼承了Object類,String類是final類,是不能被繼承的,
Object類的成員方法equals(Object obj)用來比較兩個對象是否相等:對於任何非null的引用x和y,當且僅當x和y指向同一個對象的時候,x.equals(y)返回true。
2.java.lang.Comparable是一個接口,成員方法compareTo(T o)是從順序上來比較本對象跟指定的對象,當本對象小於指定的對象,返回負整數,當本對象等於指定的對象,返回0,當本對象大於指定的對象返回正整數,
實現必須確保對於所有的x和y,sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) (意味着如果y.compareTo(x)拋出異常,那么x.compareTo(y)也一定會拋出異常
實現必須確保關系是可以傳遞的,x.compareTo(y)&&y.compareTo(z)>0意味着x.compareTo(z)>0
最后實現必須保證 x.compareTo(y)==0,代表對於所有的z ,sgn(x.compareTo(z)) == sgn(y.compareTo(z))
強烈推薦但不是嚴格要求(x.compareTo(y)==0) == (x.equals(y)),一般地任何實現Comparable接口的類如果違法這個規則需要明確地指出來這個問題,更推薦的說法是:這個類有自然的順序跟equals是一致的。
在前面的描述中,記號sgn(expression)是數學的正負號函數,定義了如果表達式的值是負數,返回-1,表達式的值是0,返回0,表達式的值是整數,返回1
int compareTo(T o)
Parameters:
-
o
- the object to be compared. - Returns:
- a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.
- Throws:
-
NullPointerException
- if the specified object is null -
ClassCastException
- if the specified object's type prevents it from being compared to this object.