为什么要重写equals()方法?
因为继承Objec的equals方法只能判断两个对象是否是同一个对象。可是我们认为常用的equals方法应该具有逻辑判断功能,所以我们重写equals方法,可以按照我们所需的要求自定义。
Object中equals方法
Object中的equals方法用于检测一个对象是否等于另外一个对象. Object类中,判断两个对象是否引用同一个对象实现equals方法,源码如下:
public boolean equals(Object obj
) {
return (this == obj
);
}
实际处理中,若要比较两个对象是否相等,一般需要重写equals方法.
equals()与==的区别
==比较基本数据类型,比较的是值==比较引用数据类型,比较的是地址equals()本身也比较地址,因为在equals()方法中,直接return的就是 this == obj但是因为String类对equals()方法进行了重写,所以可以比较内容
代码
package Test1
;
public class Person {
private String name
;
private String idCard
;
public String
getName() {
return name
;
}
public void setName(String name
) {
this.name
= name
;
}
public String
getIdCard() {
return idCard
;
}
public void setIdCard(String idCard
) {
this.idCard
= idCard
;
}
public Person(String name
, String idCard
) {
this.name
= name
;
this.idCard
= idCard
;
}
public Person() {}
@Override
public boolean equals(Object obj
) {
if (this == obj
) {
return true;
}
if (obj
instanceof Person) {
Person p
= (Person
)obj
;
if(this.getName().equals(p
.getName()) && this.getIdCard().equals(p
.getIdCard())) {
return true;
}
} else {
System
.out
.println("不要瞎传对象");
}
return false;
}
public static void main(String
[] args
) {
Person p1
= new Person();
Person p2
= new Person();
System
.out
.println(p1
== p2
);
System
.out
.println("=========我是分隔符========");
Person p3
= new Person("赵四" , "41023459578");
Person p4
= new Person("赵四" , "41023459578");
System
.out
.println(p3
.equals(p4
));
System
.out
.println("=========我是分隔符========");
Person p5
= new Person("广坤" , "4101234");
Person p6
= new Person("广坤" , "41022356");
System
.out
.println(p5
.equals(p6
));
}
}
输出结果为:
java规范中对equals方法的约束
java规范中equals方法特征
自反性对于任何非空引用x, x.equals(x) 返回true;
对称性对于任何引用x, y, 当且仅当y.equals(x) 返回true, x.equals(y)返回true;传递性对于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 则 x.equals(z)返回true;一致性若x和y引用的对象没有发生改变, 则反复调用x.equals(y)应该返回同样的结果.
对任意非空引用x, x.equals(null) 返回false;