2019独角兽企业重金招聘Python工程师标准>>>
下面给出编写一个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转换为相应的类类型变量:
ClassName other=(ClassName)otherObject;
6>现在开始对所有需要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true;否则返回false。 覆盖equals时总要覆盖hashCode
一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会 违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和 Hashtable。
- 在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
- 如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
- 如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。