Java中 Objects.equals()和==的区别

一:使用默认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()方法
    }
}