这道Java基础面试题你真的会吗?

你咱不往下看,先想想你的答案是什么?

这里先来聊聊String的intern()方法是干什么的?

intern方法是一个native方法,空口无凭,咱们还是可以看看Stirng的源码

从方法的注释咱们可以知道,它的作用:

1:如果字符串常量池中已经包含一个等于此Stirng对象的字符串,则返回代表池中的这个字符串的String对象,

2:第一条不成立。则将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用

再回到上面的题目,答案有两种,

1:如果jdk版本为1.6时,会打印出两个false

2:如果jdk版本是大于等于1.7的话,打印出来的是true和false各一个

为什么会这样呢????

第一,jdk1.6中intern方法会把首次遇到的字符串实例复制到永久代,返回的也是永久代中这个字符串的引用,并且StringBuilder创建字符串实例是在堆上,所以必然不是同一个引用,所以导致都是false。

第二,jdk1.7中intern方法的实现不会再复制实例,只是在常量池中记录首次出现的实例引用,因此intern方法返回的引用和StirngBuilder创建的那个字符串实例是同一个,对于str2中比较返回false是因为"java"这个字符串在执行StirngBuilder.toString()之前已经出现过了,字符串常量池中已经有它的引用了,不符合首次出现的原则,而"计算机软件"这个字符串则是首次出现的,因此返回true。

在上面的第二条中的"java"字符串的解释貌似有些牵强,下面再来证实一下。

这个就足够解释上面答案了

更多java技术,请扫描关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田哥coder

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值