String常見面試題

直実發表於2024-12-01

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

相關文章