浅谈Java中equals()和==的区别

一.先来说说Java的基本数据类型和引用类型

 

八大基本数据类型:Byte,short,int,long,double,folat,boolean,char,其中占一个字节的是byte,short和char占两个字节,int,float占四个字节,double和long占8个字节,boolean只有true和false,这八种数据变量中直接存储值

八大基本数据类型对应着各自的封装类型,提供了更多的方法,且不进行初始化时值默认为空(基本数据类型必须初始化)

像String类型属于引用类型,变量中存储的是地址,对应的地址存储数据

 

二.equals和==

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

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

举个通俗的例子来说,==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个

比如下面的代码

 

public class EqualsTest {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Integer aaa=new Integer(5);

        Integer bbb=new Integer(5);

        

        int a=10;

        int b=10;

        String str1=new String("justice");

        String str2=new String("justice");

        String str3;

        str3=str1;

        

        

        System.out.println(aaa==bbb);

        System.out.println(aaa.equals(bbb));

        System.out.println(a==b);

        

        System.out.println(str1==str2);

        System.out.println(str1.equals(str2));

        

        

        System.out.println(str1==str3);

        System.out.println(str1.equals(str3));

    }

 

}

 

对应结果如下

 

aaa和bbb都是Integer封装类型,是不同的对象,变量存储地址, 所以==结果为false,equals为true

a和b都是基本数据类型,变量存储值,所以==为true,基本数据类型无equals方法(没有意义)

str1和str2都是String类型,属于引用类型,变量存储地址,所以==为false,equals为true

创建str3的时候,str3指向了str1,所以str1和str3的指向同一个地址,存储的数据自然相同,所以均为true

三.接下来看个有意思的事情(有点神奇)

看图思考一下结果是什么???

 

结果。。。。。。。。。。。。。。。。。。。。。。。。 

 

说下原因,之所以会有疑问,是大家觉得a和c是不同的对象,所以地址不同,所以结果为false才对,但是定义一个Integer变量时,会默认进行Integer.valueOf(a)操作,看一下这个方法的源码(按住ctrl+鼠标左键进入该方法),

 

high的值为127,low的值为-128,当进行这个方法时如果值在-128-127之间,返回的值也就是地址是相同的,所以a和c的地址相同,a==c自然为true

 

posted @ 2021-04-08 13:45  Code_Dog  Views(387)  Comments(0Edit  收藏  举报