【面试题】equals 和 “==“ 的区别

equals 和 “==” 的区别

“==” 和 equals 最大的区别是:

  • “==” 是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值
  • equals 是 Object 的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值

一、“==”

“==” 是运算符

  1. 如果比较的对象是基本数据类型,则比较的是其存储的值是否相等;
  2. 如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。

二、例子解释和说明

public class Demo {
    public static void main(String[] args) {
        // 基本数据类型的比较
        int num1 = 10;
        int num2 = 10;
        System.out.println(num1 == num2); // 结果为:true

        // 引用数据类型比较
        String str1 = "hello java";
        String str2 = "hello java";
        System.out.println(str1 == str2); // 结果为:true

        String s1 = new String("hello java");
        String s2 = new String("hello java");
        System.out.println(s1 == s2); // 结果为 false

    }
}

在上面的例子中我们发现,前两个例子的比较结果都为 true,但是最后一个例子的比较为 false。那为什么值一样但是使用 “==” 比较的时候有的为 true,而有的为 false?

解释(先看图):

在这里插入图片描述

我们可以看到:

  • 基本数据类型使用 “==” 比较时,比较的是值是否相等;

  • 在没有 new 情况下,引用数据类型比较时,先是在常量池中寻找是否存在这个常量,如果不存在,先在常量池中创建这个常量,并赋予地址,然后引用地址值;如果存在,则直接引用该地址值。

  • 在 new 的情况下,返回的是堆中创建的对象的地址值;每 new 一个对象,就会在堆中开辟一个新的空间来存储对象。

三、equals

equals 是 Object 的方法,用来比较两个对象的地址值是否相等。

注意

  • equals 方法不能用于比较基本数据类型,如果没有对 equals 方法进行重写,则相当于 “==” ,比较的是引用类型的变量所指向的对象的地址值
  • 一般情况下,类会重写 equals 方法用来比较两个对象的内容是否相等。比如 String 类中的 equals() 是被重写了,比较的是对象的值

四、例子解释和说明

public class Demo {
    public static void main(String[] args) {
        // 基本数据类型的比较
        int num1 = 10;
        int num2 = 10;
        System.out.println(num1 == num2); // 结果为:true

        // 引用数据类型比较
        String str1 = "hello java";
        String str2 = "hello java";
        System.out.println(str1 == str2); // 结果为:true,比较的是地址值
        System.out.println(str1.equals(str2)); // 结果为:true,比较的是内容

        String s1 = new String("hello java");
        String s2 = new String("hello java");
        System.out.println(s1 == s2); // 结果为 false,比较的是地址值
        System.out.println(s1.equals(s2)); // 结果为:true,比较的是内容

        // 没有重写 equals 方法的类中 == 与 equals 的比较
        People p1 = new People();
        People p2 = new People();
        People p = p2;
        System.out.println(p1); // People@5cad8086
        System.out.println(p2); // People@6e0be858
        System.out.println(p); // People@6e0be858
        System.out.println(p1.equals(p2)); // false,p1 和 p2 的地址值不同
        System.out.println(p.equals(p2)); // true,p 和 p2 的地址值相同
    }
}

class People{

}

我们通过例子可以看出,equals 在 String 类中重写之后,比较的是值是否相同;equals 在没被重写时比较的是地址值,同 “==” 一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superLango

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值