常見的String面試題目

image.png

左上:
由於String創建前會先檢查StringTable中有沒有相同內容的物件
若有則會複用已存在的物件
故答案output = True
參考: String類的特點 字符串常量池

右上:
image.png
流程:
1. s1創建,由於"abc"不存在所以創建"abc"於StringTable
2. s2創建 new一個String Object,此時創建出來的位置並非在StringTable中
3. 傳入的"abc"根據Java Api ,應是將"abc"的底層byte位置傳到了s2 new出來的 string 物件中,是地址間的傳值image.png
4. 最後的結果看起來是複製了一份s1的String資料到s2的string資料中,實際上應該是複製了一個s1的底層地址給s2image.png
雙引號創造出的String VS 構造方法創造出來的String有何區別:
存放位置不同

最終結果:
共創建了兩個String對象,一個在StringTable中,另一個則在Heap有獨立的空間,並且,儘管看起來像是s1複製了值傳給s2,實際上則是複製了底層的byte code地址
最後答案為 false

左下:
內存圖:image.png
考的是對String 用加號串接的理解
流程:
1. 創建"abc" in StringTable 指向s1
2. 創建"ab" in StringTable 指向s2
3. 先創建"C" in StringTable
4. 由於有加號 會在堆內存中創建一個StringBuilder物件
5. 會將s2的"ab"與"c"在StringBuilder完成拼接
6. 由於s3定義是string物件非StringBuilder,StringBuilder會用toString方法創建一個String物件"abc"
7. s3指向"abc"
答案為 false

右下:
image.png
由於Java帶有常量優化機制
所以經過編譯後,class檔裡面的內容已經變成

// String s2 = "a" + "b" + "c";
String s2 = "abc";

本題考的是對Java的常量優化機制的理解
故答案為True