背景:最近在研究静态扫描的东西,遇到一个规则:"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 nullClassCastException
- if the specified object's type prevents it from being compared to this object.