第一题:打印的结果是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