深入 -- 雙引號字串加號(+)拼接 建立了幾個物件?
雙引號字串加號(+)拼接 建立了幾個物件?
結論先行:
雙引號字串 加號(+) 拼接,不論多少,只建立了一個物件。
昨天看到一個題目,挺有意思的。
大意是:
String a = "1"+"2"+"3"+"4";
建立了幾個物件??
我當時第一反應是1個物件。
為什麼呢?
因為 雙引號字串 直接寫是在編譯器就直接生成一個物件,class在編譯的時候直接放入字串常量池的。
這個知識點,可能時間有點久,自己也不太確定。
找兩個同事問了問,給了我一個不一樣的答案。
他們認為起碼建立了 大於4個物件,底層是通過StringBilder 或 StringBuffer 進行的字串拼接。
我也是一臉矇蔽…自己分析看下唄..
分析:
我們先看下JDK官方 String API中的說法:
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
注意下,上面標紅的字。
根據 API 中提供的樣例,可以看到是 雙引號字串 和 物件相加。
這種情況,肯定是StirngBuilder 或 StringBuffer 進行的拼接。
對於這個, 我沒有異議。
看一個案例
String a = "1";
String b = "2" + a;
System.out.println(b);
String c = "9" + "8" + "7" + "6";
System.out.println(c);
這裡,"2" + a , 內部是呼叫了StringBuilder 或 StringBuffer 的append。
來看下,反彙編:
字串"2" 和 物件a,進行 加號(+) 拼接的時候,呼叫的StringBuilder 的append,沒問題....
既然 JDK API 中沒有明確說明多個雙引號字串相加是什麼情況,我們看下反彙編的結果:
可以看到直接就是 "1234"
再看下編譯後的Class檔案:
按照同事說的是字串拼接的話,那應該在Class檔案、反彙編中體現出來。
但是,並沒有。
在生成的Class檔案中,直接就是一個拼接好的字串。
之後,JVM再去讀取Class檔案、解析Class檔案,類載入,發現這個變數之後,直接放入字串常量池。
如有問題,歡迎指正