Objects中的equals和deepEquals二者方法的区别

1、如果只是非数组【对象】,二者等价。

public class Demo8 {
    
    
    public static void main(String[] args) {
    
    
        String a = "abc";
        String b = "abc";
        System.out.println(Objects.equals(a,b));
        System.out.println(Objects.deepEquals(a,b));

        Baby baby_1 = new Baby("Baby");
        Baby baby_2 = new Baby("Baby");
        System.out.println(Objects.equals(baby_1,baby_2));
        System.out.println(Objects.deepEquals(baby_1,baby_2));
    }
}

运行结果:
在这里插入图片描述

2、如果是基本类型的数组,equals在二者物理地址相同(即实际上是同一个数组)的情况下返回true。如果物理地址不同,就算内容一样,也会返回false;而deepEquals只需内容一样就会返回true。

public class Demo9 {
    
    
    public static void main(String[] args) {
    
    
        int[] array={
    
    1,2,3};
        int[] array_ref=array; //与array其实是同一个数组,二者物理地址相同
        int[] array_same_content={
    
    1,2,3}; //与array为两个数组,物理地址不同,但内容相同
        System.out.println(array.equals(array_same_content));//Object类
        System.out.println(Objects.equals(array,array_same_content));
        System.out.println(Objects.deepEquals(array,array_same_content));

        System.out.println(array.equals(array_ref));//Object类
        System.out.println(Objects.deepEquals(array,array_ref));
    }
}

运行结果:
在这里插入图片描述

3、如果是对象类型的数组,equals在二者物理地址相同(即实际上是同一个数组)的情况下返回true。如果物理地址不同,就算内容一样,也会返回false;而deepEquals则不会这么苛刻,它会进一步去比较每个元素,又是比较。。。对元素怎么比较呢?也是deepEquals。。。(可能有多层嵌套,所以叫deepEquals嘛)。还是用案例说话吧!

  • 数组中的对象成员重写了equals方法(内容相同即相等):
public class Demo10 {
    
    
    public static void main(String[] args) {
    
    
        String[] strArray={
    
    "Tom","Mary"}; //String[]数组的成员是String对象,String对象重写了equals方法(内容相同即相等)
        String[] strArray_same_content={
    
    "Tom","Mary"};
        System.out.println(strArray.equals(strArray_same_content)); //物理地址不同,false
        System.out.println(Objects.equals(strArray,strArray_same_content));
        System.out.println(Objects.deepEquals(strArray,strArray_same_content)); //内容相同,每个String成员的equals为true,最后返回true
    }
}

运行结果:
在这里插入图片描述

  • 数组中的对象成员没有重写equals方法(即要想每个成员的equals为true,成员的物理地址得相同!)
//案例一
public class Demo11 {
    
    
    public static void main(String[] args) {
    
    
        Car[] array=new Car[]{
    
    new Car("奔驰"),new Car("宝马")}; //Car[]中的Car没有重写equals方法,两个Car元素要想equals,物理地址相同才行!
        Car[] array_same_content=new Car[]{
    
    new Car("奔驰"),new Car("宝马")};
        System.out.println(array.equals(array_same_content));
        System.out.println(Objects.deepEquals(array,array_same_content));
    }
}

运行结果:
在这里插入图片描述

案例二:
public class Demo12 {
    
    
    public static void main(String[] args) {
    
    
        Car BMW=new Car("BMW");
        Car Benz=new Car("Benz");
        Car[] array=new Car[]{
    
    BMW,Benz};
        Car[] array_same_address=new Car[]{
    
    BMW,Benz};
        System.out.println(array.equals(array_same_address)); //两个数组物理地址不同,false!
        System.out.println(Objects.deepEquals(array,array_same_address)); //虽然两个数组的物理地址不同,但每个元素地址都相同,true!
    }
}

运行结果:
在这里插入图片描述

deepEquals有什么用?

当我们想要比较两个数组内容是否相同时,就用deepEquals!(若为对象数组,且对象没有重写equals方法,则不推荐使用)

猜你喜欢

转载自blog.csdn.net/weixin_46312449/article/details/113215113
今日推荐