面试常见的问题:== 与 equals的区别

== 与 equals的区别

        首先== 与 equals使我们在学习java入门基础的时候学习到大,在后续的工作中经常会用到这两个方法,并且在跳槽面试中面试官也会经常问到这个问题,那么这两者有什么区别呢,今天就来研究一下这个问题。

        要想深入理解这两个方法之间的区别,我们可能要懂得一点点jvm相关知识, 在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中
在这里插入图片描述
在这里插入图片描述
初步认识equals与==的区别:

         ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
        ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
        ==指引用是否相同, equals()指的是值是否相同

举例说明:

public static void main(String[] args) {
        String A = new String("Hello World");
        String C = "Hello World";
        String D = "Hello World";
        String B = new String("Hello World");
        System.out.println(A == B);
        System.out.println(A == C);
        System.out.println(B == C);
        System.out.println(C == D);

        System.out.println(A.equals(B));
        System.out.println(A.equals(C));
        System.out.println(B.equals(C));
    }
    //大家先不要急着输出答案,可以自己判断一下以上输出结果,最后在和自己的
    //答案就行比对

在这里插入图片描述
        == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
        equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。String A = “Hello World”;是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String A = “Hello World”;形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"Hello World"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象, 如果没有,则在常量池中新创建一个"Hello World",下一次如果有String B = “Hello World”;又会将B指向"Hello World"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象。而String C= new String(“Hello World”);和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
        也可以这么理解: String str = “Hello World”; 先在内存中找是不是有"Hello World"这个对象,如果有,就让str指向那个"Hello World".
如果内存里没有"Hello World",就创建一个新的对象保存"Hello World". String str=new String (“Hello World”) 就是不管内存里是不是已经有"Hello World"这个对象,都新建一个对象保存"Hello World"。

输出结果:
在这里插入图片描述

        以上是对String字符串的讲解,如果是基本类型比较,那么只能用==来比较,不能用equals
        对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。

总结:
  如果是基本类型比较,那么只能用==来比较,不能用equals ,如果是基本类型的包装类型,那么用equals。

====================== END =========================

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值