equals()与==的区别(有图)

1,==是运算符,它是比较两者存储地址是否相同。

2,equals()是Object类里的一个方法,它比较的是两者内容是否相同。并且equals()不能用于基本数据类型的比较,如,int,double,

下面我们通过这个例子来更深层的理解两者的不同:

在这之前我们要先搞懂下面两种定义方式的区别, 

String s1="hhh";

String s2=new String("hhh");

 我们知道String型的数据是存储在常量池里的,如果我们给一个String赋值为“hhh”时,常量池并不会马上开辟一个新的空间,而是先扫描常量池里有没有以前被赋值的“hhh”。如果有,那么String对象会指向已有的“hhh”地址,如果没有现成的“hhh”,才会开辟新的空间,存储“hhh”,并把存储地址传给String对象。这样可以节约大量宝贵的存储空间。

 一般情况下我们都用第一种创建方式来给s1赋值,但是String s1='hhh';这个过程不会在堆里创建s1的空间,而是直接在常量池里开辟存储空间,存储"hhh",(因为String型是我们日常大量使用的,如果每建立一个String对象就在堆里开辟一个空间,那将非常浪费。)然后把常量池存储地址存储在栈里的s1里。

如果使用String s2=new String("hhh");就不一样了。使用了new就会在堆空间里开辟一个空间给s2对象,这时栈里的s2里存储的就是s2在堆空间里的地址了。而此时栈空间里的s1存储的是常量池的地址。

这两种方法的内存地址区别,如图, D01是s2对象地址,CL01是“hhh”在常量池里的地址。

 我们再比较一下,

        String s1="hhh";
        String s2=new String("hhh");
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));

 ==输出的是false,

而equals()输出的是true。

很明显equals()只比较了s1和s2的内容,而==比的是地址。

如果是下面的定义方式,

        String s1=new String("hhh");
        String s2=new String("hhh");
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));

==是false,equals()是true。

        String s1="hhh";
        String s2="hhh";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));

==和equals()都是true

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃巧乐兹的源

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

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

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

打赏作者

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

抵扣说明:

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

余额充值