比较一般有两种方法:① == ②equals()
一、==
先来看看( p1 == p2) 的结果:
Persion p1 = new Persion(“张三” , 18);
Persion p2 = new Persion(“张三” , 18);
p1 == p2 //结果为不相等:
为什么?因为:
== (基本数据类型) 比较的是值是否相等
== (引用数据类型) 比较的是对象内存地址
因为new开辟了两段内存 ,所以 p1 == p2 不相等
二、equals()
那 p1.equals(p2) 的结果呢? 还是不相等:
为什么?因为:
equals()方法默认也是使用 ==【equals源码】
三、equals()的使用
为了使用equals()方法比较引用数据类型的对象,需要重写equals()方法:
IDEA编译器生成的重写equals()方法:
@Override
public boolean equals(Object o) {
if (this == o) return true;
// 1、判断两对象是否在同一块内存,是则返回相等
if (o == null || getClass() != o.getClass()) return false;
//2、非空判断和是否同一类对象类型判断
Persion persion = (Persion) o;
//3、将Object类型向下转换成Persion类型
return age == persion.age &&
Objects.equals(name, persion.name);
//4、转换成基本数据类型再使用==和equals来比较
}
为了更好理解,将代码细化:(能看懂上面代码的可以忽略下面代码了)
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
//1、判断两对象是否在同一内存
}
if (o == null){
return false;
//2、判断传入对象是否为空
}
if (o instanceof Persion){
//3、instanceof 关键字判断是否是同一类
Persion p = (Persion) o;
//4、Object向下转型为Persion
if (this.name.equals(p.name) && this.age == p.age){
//5、转换成基本数据类型再使用==和equals()比较,都相同返回true
return true;
}else {
return false;
//比较结果不一样返回false
}
}else {
return false;
//对象类型不一样也返回false
}
}