1. 程式人生 > >深入 -- 雙引號字串加號(+)拼接 建立了幾個物件?

深入 -- 雙引號字串加號(+)拼接 建立了幾個物件?

雙引號字串加號(+)拼接 建立了幾個物件?

結論先行

雙引號字串 加號(+) 拼接,不論多少,只建立了一個物件

昨天看到一個題目,挺有意思的。

大意是:

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檔案,類載入,發現這個變數之後,直接放入字串常量池。

如有問題,歡迎指正