在重写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方法的一些理解,若有不当之处欢迎指正。