八.覆盖equals时遵守通用约定
自反性
对于任何非空的引用值x,x.equals(x)必须返回true
对称性
对于任何非null的引用值想,x和y,y.equals(x)为真时,x.equals(y)也为真
传递性
对于任何非空的引用值x,y,z,x.equals(y)为true,y.equals(z)为true时,x.equals(z)必须为true
一致性
对于任何非空的引用值x和y,只要equals的比较操作在对象中所有的信息没有被修改,多次调用x.equals(y)一致返回true。或者一致返回false
对于任何非空的引用值x,x.equals(null)必须返回false
实现高质量equals
1.使用==检查参数是否为这个对象的引用
2.使用instanceOf检查参数是否为正确的类型
3.把参数转换成正确的类型
4.对于类中的每个域,检查参数中的域是否与对象中的对应的域相匹配
对于不是float和double的基本数据类型可以用==比较,对象引用域递归的调用equals方法,float域可以用Float.compare方法,double可以用Double.compare方法,同样可以用==,但是因为存在Float.NaN和-0.0f以及类似的double常量,所以需要特殊处理
public static void main(String[] args) { float a = Float.NaN; float b = Float.NaN; if(Float.compare(a, b)==0){ System.out.println(true); } }
数组可以用Arrays.equals方法比较
public static void main(String[] args) { int []d = {1,2,3}; int []e = {1,2,3}; if(Arrays.equals(d, e)){ System.out.println(true); } }有些对象引用域包含null可能是合法的,可以这么写
(field == null ? o.field == null : field.equals(o.field))如果field和o.field是相同的对象引用,这么写更快
(field == o.field||(field !=null&&field.equals(o.field)))
九.覆盖equals时总要覆盖hashCode
十.始终要覆盖toString
十一.小心的覆盖clone
最好不用
十二.考虑实现Comparable接口