【Java基础】详解==和equals的区别

目录

==

==对比的是什么:

1.基本数据类型对比的是变量值

2.引用类型对比的是队中的内存对象地址

equals

==和equals的区别


==

==对比的是什么:

对比的是栈中的值

        1.其中基本数据类型是对比变量值

        2.引用类型是对比堆中内存对象的地址(可能两个相同的值有在堆中有不同的地址)

对于这三条语句,我们来逐一的分析

1.基本数据类型对比的是变量值

没有什么好说的,基本数据类型是比较栈中的值,只要值相等,两者就是相等

但是这里需要注意一下基本数据类型的包装类,可以参考这篇文章自动拆装箱

2.引用类型对比的是队中的内存对象地址

        因为实例化的对象是放在堆中的,栈中通过调用堆中对象的引用来操作对象,所以可能存在对象中值是相等的,但是因为不同对象在堆中的地址不同,所以在栈中的引用地址也不同,所以==不相等

equals

 equals是一种方法,重写之前和==并没有什么区别

我们可以看到在Object中,equals方法就是和==相同

【Java基础】详解==和equals的区别

但是大部分类,都会重写这个方法例如String,将其重写为只比较值,不比较地址的形式

【Java基础】详解==和equals的区别

==和equals的区别

        ==是判断两个变量或者实例是不是指向同一个内存空间

        equals在Object中和==相同,但是一般将方法重写为判断两个变量或实例所指向的内存空间的值是不是相同

对于下列代码

public class Test04 {
    public static void main(String[] args) {
        String a = "123";
        String b = "123";
        String c = new String("123");
        System.out.println(a == b);             //true
        System.out.println(a.equals(b));        //true
        System.out.println(a == c);             //false
        System.out.println(a.equals(c));        //true
    }
}

String a = "123"是一种很特殊的形式,和new有本质的区别,赋值形式在java中叫做直接量

        1.直接量创建对象会在JVM中发生字符串拘留,声明这样一个字符串后,JVM会在常量池中先查找有没有一个值为"123"的对象

                如果有,就直接将a指向常量池中的引用

                如果没有,就在常量池中新创建一个"123",下次如果有新的直接量等于"123"则重复上面的的步骤

        2.new创建的对象会会在堆中开辟一个空间,所以每个地址都不相同并且与常量池的地址也不同

参考文章

优美的讲解equals和==的区别_无聊的大鱼-CSDN博客_equals和==的区别

膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili

上一篇:123


下一篇:C语言基础知识