对于所有对象都用的通用方法

时间:2021-09-23 16:03:26

八.覆盖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接口