从新编写equals方法的建议


下面给出编写一个equals方法的完美建议
1>显示参数命名为otherObject,稍后须要将它转换成另外一个叫作other的变量。
2>检测this与otherObject是否引用同一个对象:
if(this==otherObject) return true;
这条语句是一个优化。实际上,这是一种常常采用的形式。由于计算这个等是要比一个一个地比较类中全部的域付出的代价小得多。
3>检测otherobject是否为null,若是为null,返回false。这项检测是颇有必要的。
if(otherObject==null) return false;
4>比较this与otherObject是否属于同一类。若是equals的语义在每一个子类中有所改变,就使用getClass检测:
if(getClass()!=otherObject.getClass()) return false;
若是全部的子类都拥有统一的语义,就使用instanceof检测:
if(!(otherObject instanceOf ClassName)) return false;

5>将otherObject转换为相应的类类型变量:
java

ClassName other=(ClassName)otherObject;
6>如今开始对全部须要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域。若是全部的域都匹配,就返回true;不然返回false。

覆盖equals时总要覆盖hashCode
  一个很常见的错误根源在于没有覆盖hashCode方法。在每一个覆盖了equals方法的类中,也必须覆盖hashCode方法。若是不这样作的话,就会 违反Object.hashCode的通用约定,从而致使该类没法结合全部基于散列的集合一块儿正常运做,这样的集合包括HashMap、HashSet和 Hashtable。
  • 在应用程序的执行期间,只要对象的equals方法的比较操做所用到的信息没有被修改,那么对这同一个对象调用屡次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的屡次执行过程当中,每次执行所返回的整数能够不一致。
  • 若是两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生一样的整数结果。
  • 若是两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不必定要产生相同的整数结果。可是程序员应该知道,给不相等的对象产生大相径庭的整数结果,有可能提升散列表的性能。
相关文章
相关标签/搜索