首页 > 代码库 > Effective Java之equals()

Effective Java之equals()

  Object对象中有个equals()方法,这个方法的作用就是用来判断两个对象的值域是否相等。一般来讲==操作符比较的是两个对象在内存中的位置是否相等,或者用于非fload和double的基本类型中。一般不同的对象,如果用==操作符比较的话,都会返回false。如果我们复写自己的值类函数,采用覆盖equals()的方法来对类的对象进行比较。

  equals()复写有一定的规则,下面详细讨论。

  1、自反性:即自己和自己比较一定要返回true。

  2、对称性:即x.equals(y)和y.equals(x)要相等。一般是在equals()方法中涉及到多个不同类型的对象时,容易出现违反对称性的现象,一般equals()用来比较的对象都是当前类。

  3、传递性:即x.equals(y)、y.equals(z)及z.equals(x)的结果应该吻合。

  4、一致性:即在对象属性不变的情况下,多次比较的结果应该相同。

  看完书上的介绍后,感觉equals()方法很脆弱,所以代表活动实体的类不要覆盖equals()方法,对于一定要写equals()方法的值类,尽量不要出现继承的关系,因为继承会出现违反对称性的情况,或者能够保证父类无法生成实例,比如抽象类等。

  复写equals(Object o)千万不要将入参的Object变成具体的类,如果改变Object,那么,equals相当于是多态,而不是复写父类的方法,这种错误很难定位。

  equals方法中的第一件事应该是入参判断,判断入参是否是合法的类型。

  最后一个忠告,复写equals()方法的同时一定要复写hashcode()方法,Object在生成实例时,会为每个实例产生一个hashcode,在于散列类,比如hashTable,hashMap等交互时,要用hashCode来进行第一层的判断。写hashCode()时要注意的是相同的对象hashcode一定相同,当不相同的对象hashcode也可能相同。

Effective Java之equals()