2021-03-25

Java中的‘==’和equals的区别

八大基本数据类型:byte,short,int,long,double,folat,boolean,char

  • ==’:

对于基本数据类型的变量,==是直接对其进行比较。

对于引用数据类型的变量,==是对其内存地址的比较

因此,不管怎样,==是对数值上的一种比较。

  • equals

任何类都继承Object类,Object中就有equals方法:

没有重写equals方法之前,equals方法里是直接调用==,因此实质上与==没有差别。

但是要注意:equals方法不能作用于基本数据类型的变量,这是因为基本数据类型非对象的缘故,没有方法。

在一些类库当中这个方法被重写了,比如String 、Date、ArrayList等类,这样就不在是去比较在堆内存中的存放地址了。

这里我们可以看下String类里equals方法的重写:

可以看到在String类里,equals是逐一对比两者的内容,内容相同才返回true。

  • 示例代码

  • intern()方法之后把字符串对象加入常量池中,常量池存在于方法区的,是线程共享的,是线程安全的,它会让有相同值的引用指向同一个位置。如果引用值变化了,但是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用,而并非像线程不同步那样,针对同一个对象,new出来的字符串和直接赋值给变量的字符串存放的位置是不一样的,前者是在堆里面,而后者在常量池里面。因此,对于输出a==e,a已经被加入常量池中,常量池中已有同值存在,故给e以a相同存放地址,故返回为true。因此,因为d还是在堆内存,存放地址肯定不同,d==e肯定返回为false。
  • 做字符串拼接操作,也就是字符串两两相"+"的时候,得出的结果是存在在常量池或者堆里面,这个是根据情况不同不一定的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值