Java中equals和==的区别(美团一面)

这道题是来自牛客网的一位小哥在2019的最后一天面试系统开发工程师的补招的一个面试题目,可以看出这个题目还是比较基础。不过还是有很多细节需要我们去弄清楚。以后我都找一些面试真题,来分享给大家。
在这里插入图片描述

背景介绍

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

java中的数据类型可以分为两类:

基本数据类型
byte,short,char,int,long,float,double,boolean

基本数据类型之间的比较需要用双等号(==),因为他们比较的是值

引用数据类型
接口、类、数组等非基本数据类型

Java中的字符串String属于引用数据类型。因为String是一个类

当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次就会重新开辟一个新的堆内存空间

在Object中,==和equals没有区别

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

==比较的是地址(是否是同一个对象)

class Students {
    String name;
    int age;
    char sex;

    public Students(String name,int age,char sex){
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}

public class Test {

    public static void main(String[] args) {

        // s1和s2是两个不同的对象
        Students s1 = new Students("bossxiang", 23, '男');
        Students s2 = new Students("bossxiang", 23, '男');


        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

执行结果

false
false

在String类中(对Object中的equals方法进行了重写)

equals 方法将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。(比较的是对象的值)

==比较的是地址(是否是同一个对象)

public class test1 {

    public static void main(String[] args) {

        // s1和s2是两个不同的对象,但是內容一样
        String s1 = new String("BossXiang");
        String s2 = new String("BossXiang");


        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

false
true

总结:

对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

== 的作用:
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
equals 的作用:
  引用类型:默认情况下,比较的是地址值,重写该方法后比较对象的成员变量值是否相同

在这里插入图片描述
几百本常用电子书免费领取:https://github.com/XiangLinPro/IT_book

It’s really hard to work hard
But always remember
It will always be difficult 
if you don’t work hard

努力真的很难
但是要永远记住
如果不努力
就会一直难

评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值