equals 和 == 的区别

分析equals和== 的区别

现在大多数的人印象中equals和==的区别就是一个比较地址一个比较内容,之前我也是这么认为,但其实这么说是不准确的。

首先我们看一下Object中的equals方法,你会发现里面其实就只是进行了== 的判断。

所以在Object中,equals里面实际就是用==做比较的。

那么为什么对于Strign这种数据类型用== 和equals做比较有时候会得出不同的结果呢。于是我又看了String里面的equals方法。

很明显这个方法的判断比Object里面的判断要复杂的多,先是用==做了比较,为false则比较String 的长度,最后再吧字符串拆开成char一个个的进行比较。

解释这种差异,要先从数据类型说起,大家都知道java中的数据类型分为两种,基本数据类型和引用数据类型。

这两种数据类型储存的方式是不一样的,如下图

基本数据类型是直接存在栈空间的,而引用数据类型是分开存储,栈空间存的是地址,具体的值是存在地址对应的堆空间中。

我们用 == 做比较的时候,其实比较的是栈空间里面的东西,所以基本数据类型用  == 是可以的。

但是引用数据类型使用==做比较的时候,就会出现一个情况,如上图的String b 和Strign c ,从外面的视角看上去两个字符串都是“1111111”,但是因为两个字符串的地址不一样,一个是 xxxxx一个是mmmm,所以会返回false。

这就是为什么String这种引用数据类型不能使用==的原因了,那么我们看回String中的equals方法。

能看到是做了两次比较,第一次是使用 == 为true直接返回true ,这一个是判断两个字符串的地址是否一样,如果地址都一样了,那么这两个是指向了同一个堆空间。

返回false 则进行下面的判断,判断长度和里面的每一个字符。

这样看,equals和== 的区别就很明显了。

总结一下  : 在Object中equals 方法是直接进行了== 判断,只不过对于Object下面的对象,都是重写了这个equals方法,里面是做了自己的判断逻辑而不是简单的比较堆空间的值,甚至你可以写一个 return true;不过这会被大佬喷。

好了 大概就这样。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值