== 运算符用于比较基本类型的值是否相同,或者比较两个对象的引用是否相等,而 equals 用于比较两个对象是否相等。
对于我们自定义的一个对象,如果不重写 equals 方法,那么在比较对象的时候就是调用 Object 类的 equals 方法,也就是用 == 运算符比较两个对象。看一下 Object 类中的equals 方法:
public boolean equals(Object obj) {
return (this == obj);
}
所以如果我们自定类的equal方法不能够完全满足我们的需求,不是比较引用是否相等,而是比较其中的属性是否相等。以自定义的person类为例,重写equals方法如下:
public class Person {
private String pname;
private int page;
public Person(){}
public Person(String pname,int page){
this.pname = pname;
this.page = page;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
@Override
public boolean equals(Object obj) {
if(this == obj){//引用相等那么两个对象当然相等
return true;
}
if(obj == null || !(obj instanceof Person)){//对象为空或者不是Person类的实例
return false;
}
Person otherPerson = (Person)obj;
if(otherPerson.getPname().equals(this.getPname()) && otherPerson.getPage()==this.getPage()){
return true;
}
return false;
}
public static void main(String[] args) {
Person p1 = new Person("Tom",21);
Person p2 = new Person("Marry",20);
System.out.println(p1==p2);//false
System.out.println(p1.equals(p2));//false
Person p3 = new Person("Tom",21);
System.out.println(p1.equals(p3));//true
}
}
通过重写 equals 方法,我们自定义两个对象相等的标尺为Person对象的两个属性都相等,则对象相等,否则不相等。如果不重写 equals 方法,那么始终是调用 Object 类的equals 方法,也就是用 == 比较两个对象在栈内存中的引用地址是否相等。