Java Object类中的equals方法
Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合乎情理的。然而,对于多数类来说,这种判断并没有什么意义。例如,采用这种方法比较两个PrintStream对象是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。
下面采用以下示例演示equals方法的实现机制:
public class Employee{ ... public boolean equals(Object otherObject){ //快速检查对象是否相同 if(this==otherObject) return true; //如果EcPLID参数为空,则必须返回false if(otherObject==null) return false; //如果类不匹配,它们就不能相等。 if(getClass()!=otherObject.getClass()) return false; //现在我们知道另一个对象是非空雇员 Employee other =(Employee)otherObject; //测试字段是否具有相同的值 return Object.equals(other.name); && salary==other.salary && hireDay.equals(other.hireDay); } }
getClass方法将返回一个对象所属的类,有关这个方法的详细内容稍后进行介绍。在检测中,只有在两个对象属于同一个类时,才有可能相等。
提示:为了防备name或hireDay可能为null的情况,需要使用Object.equals方法。如果两个参数都为null,Object.equals(a,b)调用将返回true;如果其中一个参数为null,则返回false;否则,如果两个参数都不为null,则调用a.equals(b)。利用这个方法,Employee的方法equals的最后一条语句要改写为:
return name.equals(name,other.name); && salary==other.salary && Object.equals(hireDay,other.hireDay);
Java语言规范要求equals方法具有下面的特性:
1) 自反性:对于任何非空引用x,x.equals(x)应该返回true。
2) 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true。
3) 传递性:对于任何引用x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true。
4) 一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。
5) 对于任何非空引用x,x.equals(null)应该返回false。