在Java中实现equals方法时应遵循的准则?

为了比较两个对象,Object类提供了一个名为name的方法equals(),该方法接受一个对象并将其与当前对象进行比较。

如果这两个对象的引用相等,则返回true,否则此方法返回false。

但是,只有两个引用都指向同一个对象时,此方法才返回true。实际上,它应该返回true id,两个对象的内容相等。

示例

class Employee {
   private String name;
   private int age;
   Employee(String name, int age){
      this.name = name;
      this.age = age;
   }
}
public class EqualsExample {
   public static void main(String[] args) {
      Employee emp1 = new Employee("Jhon", 19);
      Employee emp2 = new Employee("Jhon", 19);
      //比较两个对象
      boolean bool = emp1.equals(emp2);
      System.out.println(bool);
      Employee emp3 = emp1;
      boolean bool2 = emp1.equals(emp3);
      System.out.println(bool2);
   }
}

输出结果

false
true

覆盖equals()方法

为了解决这个问题,您可以重写该equals()方法并根据需要比较两个对象,但是,在Java中,两个对象相等时,它们必须处于等价关系中,这意味着equals方法应检查三个条件-

  • 反身-a = a;

    当使用此方法将对象与其自身进行比较时,结果应为true。

  • 对称-如果a = b,则b = a;

    obj1.equals(obj2)的值应等于obj2.equals(obj1)。即,如果obj1.equals(obj2)返回true,则obj2.equals(obj1)必须返回true。

  • 可传递的-如果a = b,则b = c,则a = c ;;

    如果obj1.equals(obj2)和obj2.equals(obj3)的值为true,则obj1.equals(obj3)的值必须为true。

在比较一个对象与当前对象相等时,您需要检查以下条件。

  • 给定对象不应为null。

if(obj == null ){
   return false;
}
  • 给定的对象应该是当前类。

if(this.getClass() != obj.getClass()){
   return false;
}
  • 给定的对象应等于当前对象。

if(this == obj){
   return true;
}
  • 当前对象的实例变量应等于给定对象的实例变量。

Employee emp = (Employee)obj;
if(this.name != emp.name|this.age != emp.age){
   return false;
}

示例

如果您用equal方法重写包含上述指定条件的上述示例,则它将检查给定的对象是否等于当前的雇员对象。

class Employee {
   private String name;
   private int age;
   Employee(String name, int age){
      this.name = name;
      this.age = age;
   }
   public boolean equals(Object obj) {
      if(obj == null ){
         return false;
      }
      if(this.getClass() != obj.getClass()){
         return false;
      }
      if(this == obj){
         return true;
      }
      Employee emp = (Employee)obj;
      if(this.name != emp.name||this.age != emp.age){
         return false;
      }
      return true;
   }
}
public class EqualsExample {
   public static void main(String[] args) {
      Employee emp1 = new Employee("Jhon", 19);
      Employee emp2 = new Employee("Jhon", 19);
      //比较两个对象
      boolean bool = emp1.equals(emp2);
      System.out.println(bool);
      Employee emp3 = emp1;
      boolean bool2 = emp1.equals(emp3);
      System.out.println(bool2);
   }
}

输出结果

true
true