在 Java 中实现 equals 方法时应遵循的准则?
java 8object oriented programmingprogramming
为了比较两个对象,Object 类提供了一个名为 equals() 的方法,此方法接受一个对象并将其与当前对象进行比较。
如果这两个对象的引用相等,则返回 true,否则此方法返回 false。
但仅当两个引用都指向同一个对象时,此方法才返回 true。实际上,如果两个对象的内容相等,它应该返回 true。
示例
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。
对称 − if a=b then 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。
在 equals 中将对象与当前对象进行比较时,需要检查以下条件。
- 给定对象不应为 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