String常见面试题

第一题:打印的结果是true还是false呢?

在之前我们就说过这题,执行s1时,检查字符串常量池,发现没有“abc”,于是创建“abc”,执行s2时,接着检查常量池,发现有“abc”,直接复用,所以s1和s2地址一致,打印出来是true

第二题:true or false

1.主方法自动进栈,执行s1,双引号“abc”,检查常量池发现没有,创建“abc”

2.执行s2,有new进堆,在堆内存中创建空间,检查常量池,发现有“abc”,所以直接将“abc”复制一份存入空间中

提问:“abc”复制的是内容还是地址呢?

答:我们需要知道,“abc”是一个对象,而它的本质其实是一个byte类型的数组所记录的值

该数组会记录每一个字节所对应的数字,a——>97 ...... 所以abc也就是97 98 99 因此,复制“abc”给堆内存的空间是将value这个数组的地址赋给空间,所以,复制的是地址。

3.空间收到abc后,s2记录地址

所以,s1与s2的地址不同,打印出来的结果是false

完整流程:https://kdocs.cn/l/cnfY68qsWVNS?linkname=150996520
.

第三题

1.主方法进栈,执行s1,检查常量池发现没有“abc”,创建对象

2.执行s2,常量池没有“ab”,创建对象

3.执行s3,先检查常量池是否有“c”,发现没有,创建“c”

4.发现有“+”即字符串拼接符,这时系统会自动产生一个新的类叫做StringBuilder

5.StringBuilder会自动将s2与“c”拼接成abc

6.拼接完之后还不能直接将地址给s3,因为s3是String类与StringBuilder类不一致,因此StringBulider还会使用一个toString方法,将其转换为String类

所以,s1与s3的地址不同,打印结果是false

完整流程:https://kdocs.cn/l/cnfY68qsWVNS?linkname=150996521

第四题

这题打印的结果是true

疑惑:为什么结果是true?上题才说完字符串拼接符,StringBuilder什么的,这题怎么就又是true了?

答:因为存在java常量优化机制,刚才是变量和“c”相加,而这题是三个常量相加,java会自动拼接在一起,所以这题本质长这样

这不就和第一题长一样吗,所以是true

posted @ 2024-12-01 11:38  直実  阅读(5)  评论(0编辑  收藏  举报