Java经典面试基础知识:==和equals有什么区别?

一、==当比较的值是基本类型时是值比较,当值是引用类型时是引用比较。
在这里插入图片描述
可以看到当值为int 时做的是值比较,按理来说a1=b1应该输出的false但是可以很明显的看到,输出的是true,但是原则上引用类型比较的是地址,那么就说明,他们俩的地址是一样的,标准并没有这样要求,但是我们的使用的hostpot(JVM)做优化的时候考虑到-128-127这个范围内的数字远远高于其他数字,所以JDK在实现的时候,缓存了-128-127的Integer对象,所以这个范围的Integer只要值相等,他们俩指向的一定是同一对象。其实代码中都有体现。在这个路径下
在这里插入图片描述
在这里插入图片描述
但是我们在记忆的时候原则上,==在比较基本类型的时候是值比较,在比较引用类型的时候是引用比较,-128-127只是一个版本上的一个优化,不能作为我们判断的依据。
还有一点就是在比较Integer和int的时候,编译器会做一个自动解包的过程,其实是相当于c=a3.intValue();的结果。所以是相等的。
二 、
equals是原始类Object的方法,即所有对象都有equals方法,默认情况下(即没有重写)是引用比较,但是JDK中类很多重写了equals方法(一般是先进行 引用 比较,再判断是否要进行值比较),所以一般情况下是值比较,注:基本类型不能使用equals比较,而是用 == ,因为基本类型没有equals方法。
Integer重写的equals方法:

在这里插入图片描述可以看到使用equals方法就可以进行正确的值比较。
在这里插入图片描述
但是比较某个实例对象,一定要确定该类重写了equals方法。没有实现就无法进行比较,重写equals方法就一定要重写hashCode方法。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值