第一題:列印的結果是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