在重写object类的equals()方法时总是会有几个小困惑,今天博主就写一篇博客来巩固一下,希望也能帮到你们。

首先需要强调的一点是,在object类中equals()方法和==的作用是一样的,我们来看一下equals()方法在object类中的源码:

public boolean equals(Object obj){
        return (this == obj)
}

在源码里面equals()方法是直接用==实现的,而如果我们希望不同内存但是相同内容的两个对象equals时返回true,此时我们就需要对equals方法的进行重写。

我们重点讲一下equals方法重写时的要求:

1.  首先它的参数必须为object类型,否则就不叫重写。

2.  对于任何非空值的引用x,x.equals(null)必须返回false。

3.  equals()方法必须是自反的,x.equals(x)必须返回ture。

4.  equals()方法必须是对称的,x.equals(y)和y.equals(x)返回值必须相同。

5.  equals()方法是可传递的,x.equals(y)和y.equals(z)都返回true,则x.equals(z)返回true.

6.  equals()方法是一致的,当x,y引用的对象信息没有被修改时,多次调用x.equals(y)的返回值是一样的。

我们基于以上要求重写一个Person类的equals方法,假定这个Person类只有name和age两个属性。

class Person{
    private int age ;
    private String name;
    public Person(int age,Stringname){
       this.age=age;
       this.name=name;
    }
    @Override
    public boolean equals(Objectobj) {
       //如果obj对象为空
       if(obj==null){
           return false;
       }
       else{
      //判断obj是否为Person类型的实例
           if(obj  instanceof Person){
              Person temp=(Person)obj;
      //判断各属性内容是否一致
              if(temp.age==this.age&&temp.name.equals(this.name)){
                  return true;
        
           }
       }
       return false;
}
public class TestEquals {
    public static void main(String[]args) {
       Person p1=new Person(15,"wawa");
       Person p2=new Person(15,"wawa");
       System.out.println(p2.equals(p1));
    }
}

此时输出结果为true,重写时记得验证一下equals方法的自反性,对称性,一致性和传递性,这里就不一一验证了。

注意:temp.name.equals(this.name)调用的equals方法是String类重写的equals方法,不是Person类重写的

我们重点看下equals方法里面的代码:

首先判断obj对象为不为null,为null则返回false,

第二步判断obj是否为正确的类型,

第三步检查参数中传入的属性是否与当前对象相匹配,是则返回true

还需要强调的一点是重写equals方法之后一般要对hashCode方法进行重写,这个就不细讲了。

以上是博主对equals方法的一些理解,若有不当之处欢迎指正。