“==“与“equals()方法“的区别

        在Java中通常利用"=="与"equals()方法"来进行比较,那么这两种方法到底有什么区别呢?

数据类型分为基本数据类型和引用数据类型,如果将要进行比较的是基本数据类型,那么就只能选择"=="来进行比较;

如果是引用数据类型,那么"=="与"equals()方法"都可以选择。

我们先来了解一下这两种方法:"=="是运算符,对于基本数据类型是比较值,而对于引用数据类型则是比较的内存地址值;例如:

图1:基本数据类型比较

上图中的a==b等同于5==5,结果自然是true。

图2:引用数据类型"=="比较

 可能会有人说:“张三”和“张三”不就是一样的吗,结果应该是true才对呀。String是引用数据类型,在利用"=="比较时,比较的是它们的内存地址值,s1是new的一个空间,s2是new的另一个空间,两个“张三”虽然内容一样,但是它们所处空间不同。打个比方:安徽有个叫“张三”的人,北京也有个叫张三的人,再夸张一点,他们长得还一摸一样,那就能说这两个张三是同一个人吗?显然是不能的,就算他们再相像身份证也是不一样的。引用数据类型进行"=="比较时的原理就是这样。

equals()是Object父类中的方法,基本数据类型不能使用"equals()方法;而Object父类中的equals()方法比较的是两个对象的地址值。例如:

图3

定义了一个Person类,它运用的equals()方法是继承Object类的, p1和p2分别new了两个空间,内容虽然一样,但地址值并不一样,所以结果为false。我们可以看一下底层代码:

图4:Object类中的equals()方法

 this指的是调用equals()方法的对象,return的是"==",前文我们说了引用数据类型"=="比较的是内存地址值,所以结果为false。

可能还会遇到这种情况:

图5:String利用equals()比较

String也是引用数据类型,按道理说结果应该和图3一样为false才对,但显然运行结果为true,这是为什么呢?原因是String的equals()方法并不是继承Object类的,而是经过覆盖重写后的,底层代码如下:

图6:String的equals()方法

 显而易见的是,String和Object类的equals()方法并不一样,String底层是char[ ],v1[ i ]!=v2[ i ]时return false,也就是说v1[ i ]==v2[ i ]时return true,而char是基本数据类型,所以String下经过覆盖重写的equals()方法比较的是具体的内容。

如果其它继承Object类的equals()方法的引用数据类型也想达到和String一样的效果,就需要覆盖重写equals()方法。

总的来说,"==",对于基本数据类型比较的是具体值,对于引用数据类型来说比较的是内存地址值;equals()方法,不适用于基本数据类型,对引用数据类型也稍有区别:继承Object类的equals()方法的引用数据类型比较的是地址值,一些引用数据类型会覆盖重写equals()方法,比较的是具体值或内容,自定义类也可以根据自己覆盖重写的规则来进行比较,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值