一:使用默认Objects.equals()进行比较,将比较两个对象的地址,相同返回true,不同则false;
public class Main {
public static void main(String[] args) {
String c="111";
int d=12;
Person man=new ChangShi(c,d);//("姓名",id)
Person woman=new ChangShi(c,d);
System.out.println(man.equals(woman));//由于我们没有重写equals函数,所以这两行结果相同
System.out.println(Objects.equals(man,woman));
}
}
输出结果:false
false
二:'=='默认比较地址,在String,Date,File等类中equals()方法进行了重写,并且调出Objects类源码如下
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
public class Main{
public static void main(String[] args){
String a=new String("111");
String b="111";
String c="111";
int d=12;
System.out.printf("a和b用'=='比较:%b\n",a==b);
System.out.printf("a和b用'equals()'比较:%b\n",b.equals(a));
System.out.printf("a和b用'Objects.equals()'比较:%b\n",Objects.equals(b,a));
}
}
输出结果:false
true
true//根据Objects.equals()源码可知,会比较对象的地址并再次调用子类的重写equals()所以和上行结果相同,都是调用了String.equals()
三:重写equals()方法如下
重写的意义:将其原始的比较地址变为比较内容是否相同。
public class ChangShi {
public String name;
public int id;
@Override
public boolean equals(Object o) {
if (this == o) return true;//是本身就返回true
if (o == null || getClass() != o.getClass()) return false;//为空或不是同类就返回false
Person person = (Person) o;//将对象o强制转换为本类
return id == person.id && Objects.equals(name, person.name);
//若都是基本类型,则直接判断返回即可,若为引用类型,则调用其引用类型(子类)的equals()方法
}
}