面试题之String对象的相等问题和equals的作用

抛砖

面试官问:
String s1 = new String(“abc”);
String s2 = “abc”;
String s3 = new String(“abc”);

s1和s2和s3是否相互==?

面对这类问题,对于大多数初学者还是有些困惑的,要分清这些关系到底是怎么样的当然要搞清楚它的底层和一些特性,再去分析这种问题就清晰很多!

答案

首先,我直接告诉大家,s1、s2、s3 都不==。
在这里插入图片描述
测试方法中,String是这样的:
1. 首先String s1 被new 后的对象就会保存到堆中
2. String s2 = “abc” 这条语句会在StringPool–String池中创建
3. String s3 被new了,也会到堆中保存其对象

解释:
s1在堆中保存对象,s2在String池里,所以s1和s2不==
s3也会在堆中保存对象,但是是内容相同,地址不同的,所以和s1 、s2 是不 == 的

这里为啥我要说是 == 而不是相等?
是因为Java中说两个对象相等是有歧义的,==指的是中如果内容和地址值都相等,那么才是相等。

引玉

上文的堆和Pool池都是java虚拟机的知识,我会在复习JVM时写写总结。
说了那些,其中有两个知识点需要完善一下,也是面试常见题——“==和equals的区别”、“谈谈对String的理解”

String的理解

对于String,我已经写过一篇文章,有兴趣可以看看:
https://blog.csdn.net/weixin_43934104/article/details/100587418
做个总结:
1. String创建的字符串是在常量池中,创建的变量初始化一次,如果再对该字符串改变会产生新的字符串地址值。
2. String是不可变的,对String类的任何改变都会返回一个新的String对象。

equals和==

首先讲下== ,它在我们的Java的比较,if,循环中大量存在。那么作为比较,它到底比较的是什么?需要注意什么?
1. ” == “比较的是两个变量的内容和在内存中的地址值是否全部相等,比较基本数据类型时必须用 “ == ”。

equals是Object的方法,看源码:
在这里插入图片描述
源码可以看到,Object中equals就是 == 一样的比较方法嘛,没什么特别的,那我们看看String的equals有什么不一样:
在这里插入图片描述
如此,我们应该懂了!String重写了equals方法,按它重写的后的方法使equals不会和==一样比较内容和地址值,而是获取value,单单比较内容是否一样。

一些细节和总结

  1. == 可用于所有类型equals只能用于强类型,基本数据类型是没有equals方法的。
  2. == 用于基本数据类型(原生类) 时比较值,强类型时比较内存地址,也就是常说的引用。equals是Object的方法,默认实现是 ==比较
  3. equals可以被重写,重写后按重写的规则来比较。
  4. equals如果没有比较,意义和==一样,JavaBean规定重写equals时必须重写hashCode,如果不重写就会出现对象相同,但是hashCode不同,这样会出现问题。
    比如:在HashSet中存储元素是按照hashCode,如果重写equals不重写hashCode会导致同一个对象,存储了两次。

那我们来看看hashCode,它会返回对象的 哈希代码值
Object中的hashCode源码:
在这里插入图片描述
我们看看String有没有重写hashCode呢:
在这里插入图片描述
没错,它重写了。这波可以!

文章到这里,有错误和不足请多担待并期待大牛的指点!如果觉得我写的还不错的,可以帮小的点点关注!不定期更新面试专题和项目经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值