学习JAVA不久,看了有关equals的内容,记录下来希望以后有用的时候能查找到,也希望能对别人有些许的帮助。
大家都知道JAVA有一个所有类的超类--Object类,它当中有许多的方法,其中就有equals的方法,在Object类中,这个方法用于判断两个对象是否具有相同的引用。但在自己写的类中,仅仅有这个判断是不足以满足我们的要求的。所以是需要重写这个类的,自己写的类也都应该都重写一下这个方法。
JAVA语言规范要求equals方法具有以下性质:
1)自反性:对于任何引用x,x.equals(x)返回true;
2)对称性:对于任何引用x,y,x.equalsI(y)返回true,y.equals(x)也应该返回true。
3)传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y,equals(z)返回true,那么x.equals(z)也应该返回true。
4)一致性:如果x,y引用的对象没发生变化,那么反复调用equals方法,结果不会发生改变。
5)对于任意引用非空的x,x.equals(null)返回false。
接下来提供一个完美的判断方法符合上面的性质。
判断的步骤:
@Override
public boolean equals(Object otherObject)
1.检测this与otherObject是否引用同一个对象
if(this==otherObject)return true;
这比一个一个比较两个类中的字段要省时很多,如果不是引用的同一个再进行下面的判断。
2.检测otherObject是否为null,如果为null则返回false,这是JAVA规范中要求的。
if(otherObject==null) return false;
3.检测this和otherObject是否属于同一个类,如果不是就没有比下去的意义了。
if(getClass()!=otherObject.getClass())return false;
4.将otherObject转换成相应类类型的变量。
ClassName other=(ClassName)otherObject;
5.对所有的字段进行比较,使用==比较基本类型,使用equals比较对象类型,如果都相等就返回true,否则返回false。
return field1==other.field1&&Objects.equals(field2,other.field2)&&......&&......;
下面是一个小样例,定义了一个Employee类:
public class Employee {
private String name;
private double salary;
private LocalDate hireday;
这是类中的所有字段。
下面是重写的equals方法
@Override
public boolean equals(Object otherObject)
{
//判断是否引用的同一个对象
if(this==otherObject)return true;
//判断用之比较的是否为null,是的话必须返回false
if(otherObject==null)return false;
//判断是否属于同一个类,不是的话就不相等,返回false
if(getClass()!=otherObject.getClass())return false;
Employee other=(Employee)otherObject;
//判断类里面的具体字段是否相等
return Objects.equals(name, other.name)&&salary==other.salary&&Objects.equals(hireday, other.hireday);
}
下面是从Employee类派生出来一个Manager类:
public class Manager extends Employee {
private double bonus;
重写它的equals方法:
@Override
public boolean equals(Object otherObject)
{
if(!super.equals(otherObject))return false;
Manager other=(Manager)otherObject;
return bonus==other.bonus;
}
可以看到不用从头判断,只要看利用super关键字看它的父类是否满足,接下来再单独判断一下新增字段就行了。