高频面试题:== 和 equals 的区别

发布于:2022-11-27 ⋅ 阅读:(303) ⋅ 点赞:(0)

java ==和 equals

“==” 和 equals也是高频面试的问题
所以我就记录下来,和大家分享分享啦,喜欢的可以点个赞哦

1. ==

1."==“在基本数据类型中使用是判断值是否相同
2.”=="在引用数据类型中是判断引用地址是否相等

1.1案例

1.1.1基本数据类型使用 “==”

int a = 10;
int b = 20;
int c = a;
 // a 和 b 都是基本数据类型,所以比较的是值是否相同
 System.out.println(a == b);
 System.out.println(a == c);

案例

1.1.2 引用数据类型使用“==”

案例

我们可以看到 b 对象和 a 对象为 “true”,因为 b 对象指向了 a 对象,

a 和 c 比为什么为 “false” 呢? 因为 c 对象是再次初始化的,已经不再是同一个地址
~~我们可以把他们的一个地址输出来看一下(并不是真正的对象地址)

在这里插入图片描述
可以看到 a 和 b 的地址是一致的,c 的就和 a 不是一致,所以就为“false”

2.equals

equalsobject 中的方法,默认情况是判断引用地址是否相等,一般重写 equals,比较对象的值是否相等

2.1 equals 原码

下面就是 Object 中的 equals 原码,可以看到就是判断两个对象地址是否相等
在这里插入图片描述

2.2 equals 举例

 A a = new A("Jack",12,"Java"); // 初始化对象
        A b = a; // b 指向 a 对象
        A c = new A("Jack",12,"Java"); // 初始化对象
        System.out.println(a.equals(b));
        System.out.println(c.equals(a));

在这里插入图片描述
我们可以看到使用 equals 也是和 “==”结果是一样,如果还不明白可以看上面的原码

2.3 为什么字符串没有重写 equals 方法,依然比较值是否相等?

因为字符串都是 String 的子类,String 类已经重写过 equals,我们可以看一下 String 中的 equals

在这里插入图片描述
所以在字符串比较的时候就是比较值是否相等

3.重写 equals

重写 equals 方法后,就是比较两个对象的值是否相等

    // 重写 equals
    public boolean equals(Object obj) {
        // 如果两个对象是同一个地址
        if (this == obj) { // this:哪个对象调用,this 就指向哪个对象
            return true;
        }
        // 如果不是同一个对象
        if (! (obj instanceof A)) {
            return false;
        }
        // 比较值是否相等
        A a = (A)(obj); // 向下转型,否则无法调用子类的方法
        return  this.name.equals(a.getName()) && this.age == a.getAge() && this.job.equals(a.getJob());
    }

3.1 重写 equals 后的效果

我们可以看到,重写之后判断的就是值是否相等
在这里插入图片描述

总结

1."=="在基本数据类型就是判断值是否相同
2.在引用数据类型就是判断地址是否相同
3.equals 没有重写默认调用的是 Object 中的,判断地址是否相等
4.重写equals 之后判断对象值是否相等