java中如何判断两个变量相等_Java中判断两个值相等到底是使用“==”还是“equals”呢...

用哪个???

我们先不要着急选择;

先来看看使用它们分别输出的结果;

根据结果才好剖析它们;

先来看“==”号

如下图示:

上图示例分解:

再看 “equals”方法

我们再来使用equals看看结果,

会发现结果会有些许不同,

如下图示:

上图示例分解:

为了更好的便于我们理解,

我们进入源代码来逐一看一下;

源码浅析

首先我们先打开Object对象的equals;

如下图示:

根据万类之根Object对象的equals我们发现;

本质还是“==”来进行对比数值的;

只是Integer、String等进行方法重写而已。

我们再来看一下Integer包装类

(其他基本类型的包装类都类似在此就不一一举例了)

的 equals;

如下图示:

只是将包装类转换成int然后进行值对比;

而本质依然是使用的“==”

可能你会有疑问了;

既然本质都是用的“==”为什么String对象前、后两次输出的值不同呢?

【“==”的输出的是false,“equals”输出的是true】

再回答问题之前我们先看看它的源代码;

String引用类型的equals的;

如下图示:

我们看到判定对象如果是String实例的话,

就会将引用类型String转换成了基本类型char(

进行循环比对,如果有不相同的值就返回false。

简言之,就是将引用比较转换成了值比较(

我们事例使用equals对比的数值是”2”,

值是相同的,所以返回值是true。

从这个角度我们也能很好的理解为1、 基本类型对比的是值

2、 引用类型对比的是内存地址

这就能解释明明我们的Person实例;

一个赋值的是“张三”,一个赋值的“李四”;

结果为什么是相等的呢?

看了Object对象的equals源码我们才知道,

因为他们对比的不是值,而是内存地址,

为了验证,

我们来看下图:

上图示例分解:

我们可以看到输出的内存地址,

都是相同的;

那么返回true 也就无可厚非啦;

我们重新给开辟一个内存空间,并把原本赋值的“李四”改成与上个实例相对的“张三”后;

会发生什么情况呢?

如下图示:

上图示例分解:

有没有同学已经提前猜度啦呢?

内容是相同啦,

但内存是不同的,

它既然比对的是内存地址,

返回的结果当然也就由原来的true,变成false啦。

重写toString() 方法

有聪明的同学或许会想到了;

我们上文不是刚说了吗?

引用类型String的equals方法;

能将引用比较转换成了值比较

我们将Person对象转换成String类型不就可以了吗?

那我们来试试,

如下图示:

上图示例分解:

哎…

什么情况呢?

咋不行呢?

让我们进入到对象的toString()方法里来看下

什么意思呢?

调用此方法给我返回的是;

对象的类名称 并 拼接一个16进制的hashcode码;

我们给他打印一下看看:

上图示例分解:

确实不相同;

不怪人家给返回false。

那你可能要说了,

你可能气愤啦;

这个不对啊;

跟咱们上面说的不是相悖了吗?

别着急…

这个toString()不行;

那咱们给就他造一个行的呗;

怎么造呢;

如下图示:

上图示例分解:

我们在Person的实体对象内,

使用Override注解重写toString() 方法,

接着我们再次运行,看下效果

如下图示:

上图示例分解:

我们发现重写后的结果,

符合我们的预期。

总结一下

到现在是不是你不是已经掌握了再使用的时候如何选择呢?

1、基本变量的比较方式我就用“==”

2、如果要比较实际内存中的内容,我们就要用“equals”方法

3、如果是我们自己定义的实例类,

我们自定义的类都是继承自object

从上文的源码分析推导出,

用“equals”或“==”都是一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值