Java中==和equals的差别

初学Java很多人都会在==和equals这里出错 今天在这里写个博客 也希望自己留个记忆
首先我们先能探讨下==的意义

一.==

==的作用在基本数据类型的变量上,比较的是两个变量的值是否相等
而作用于引用类型的变量,则比较的是所指向的对象的地址

而在Java有4类8种基本类型 分别是
浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean

这里写图片描述
所有上图的运行结果是三个true

但或许有些人就有些不明白下面这代码为什么还是打印的true了
这里写图片描述
String是引用类型 所以这里的==是比较的它们的地址
可以这么理解:
这里把hello这个字符串赋给了str1,而这里的str1就指的就是hello这个字符串的地址
,而又把hello这个字符串又赋给了str2,而这里的str2就也指的就是hello这个字符串的地址
所以我们str1,str2这两个字符串的地址其实就是一样的 所以得到的答案就是true
这里写图片描述
同理这个两个打印出来的也是两个true

或许又有些人不解下面这个 同样也是把str1和hello str2和hello绑定在一起了 为什么打印出来的不是true
这里写图片描述
其实这里是通过new String(“hello”) 来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定 此时str1是指向的这个对象的地址(不是值的地址)
,也就是说并不是直接存储的字符串hello
同理str2也是 两个对象地址都是通过new出来的 指向的对象地址不同 所以最后打印出来的答案不是true 是false

而此时是这么写的话答案就是true,道理有简单 都让str2指向了str1指向的对象地址,那么得到的结果毫无疑问是true。
这里写图片描述

二.equals
为了知道equals方法怎么执行的 我们需要去查看它的源码 而equals的源码在jdk下的这里写图片描述
java.lang.Object下面

源码如下:
这里写图片描述

很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

但是有些朋友又会有疑问了,为什么下面一段代码的输出结果是true?
这里写图片描述

要知道为什么我们可以去查看String类的equals方法的源码
这里写图片描述

可以看出String类是帮我们重写了equals方法的 用来比较指向的字符串对象所存储的字符串是否相等。应该两个字符串对象所存储的字符串都是hello 所以最后打印的是true

而其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。

三.总结来说
1.==
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2.equals(equals方法不能作用于基本数据类型的变量)
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
但像String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值