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。

posted on 2018-08-05 22:14  大凌轩  阅读(2201)  评论(0编辑  收藏  举报

导航