String是Java使用率最高的類,也是面試高頻考點。本文從源碼級解析String最終類、char[]本質、三種創建方式、字符串常量池機制、intern()原理、+拼接編譯優化、不可變模式設計哲學,並逐一破解經典面試題。
public final class String:不可繼承private final char value[]:底層字符數組,內容不可變String s = "abc"直接創建對象+拼接語法糖,編譯期優化| 方式 | 代碼示例 | 常量池行為 | 堆內存行為 |
|---|---|---|---|
| new關鍵字 | new String("abc") | 檢查/創建"abc" | 必創建新對象 |
| 直接字面量 | String s = "abc" | 檢查/創建"abc" | 不創建,引用池中對象 |
| 純字面量拼接 | String s = "ab" + "c" | 編譯期優化為"abc",同字面量 | 不創建 |
| 含變量拼接 | String s = "ab" + var | 檢查字面量部分 | 運行期創建新對象 |
new強制在堆創建新對象(複製池中內容)StringBuilder.append()生成新對象入堆String s = new String("abc")創建幾個對象?答案:2個(常量池1個"abc" + 堆1個副本)。
連續new String("abc")兩次:常量池1個 + 堆2個 = 3個。
+任一操作數為String → 另一操作數轉String → 拼接toString();引用類型→toString();null→"null"1+2+str+3+4 → ((("3"+"str")+"3")+"4")// 源碼
String s = 1 + 2 + str + 3 + 4;
// 編譯器等效轉換(使用StringBuilder)
new StringBuilder().append(1).append(2).append(str).append(3).append(4).toString();
優化效果:僅創建最終結果對象 + 1個StringBuilder,無中間String對象。
String s1 = "3jf34";
String s2 = "3" + "jf" + "3" + "4";
System.out.println(s1 == s2); // true!編譯期已折疊為同一常量池對象
JLS 15.28:常量表達式編譯期計算,視同字面量。
String x = "aaa" + "bbb";
if (false) { x = x + "ccc"; }
x += "ddd";
// 編譯器可能優化為:"aaa"+"bbb"+"ddd" → "aaabbbddd" (單常量)
// 或保留運行期拼接,取決於編譯器實現
public native String intern();
// 邏輯:池中有equals相等對象 → 返回池中引用
// 否則 → 將this加入池 → 返回this引用
用途:手動去重長壽命字符串,減少堆內存佔用;配合-XX:StringTableSize調優池大小。
String str = "hello";
str = str + " world"; // str引用變了,指向新對象:"hello world"
// 原對象"hello"未變,若無其他引用將被GC回收
不可變類設計原則(Demeter法則廣義):
所有操作返回新對象,原對象狀態凍結 → 線程安全、可共享、哈希碼穩定、防禦性編程無需拷貝。
| 場景 | 錯誤做法 | 正確做法 |
|---|---|---|
| 循環拼接 | s += item | StringBuilder sb = new StringBuilder(); sb.append(item); |
| 比較內容 | s1 == s2 | s1.equals(s2) |
| 大量去重 | 依賴自動池化 | intern() + 調大StringTableSize |
| null處理 | s.equals("x") | "x".equals(s) 或 Objects.equals(s, "x") |
-XX:StringTableSize=桶數:默認60013,大量intern建議設為100萬+質數-XX:+UseStringDeduplication(G1 GC):堆中重複char[]自動去重-XX:+CompactStrings(Java 9+):Latin-1字符串用byte[]存儲,節省50%內存String通過常量池去重、編譯器StringBuilder優化、final char[]不可變三大機制平衡性能與易用性。理解創建語義、拼接優化、intern機制,是寫出高性能Java代碼與通過高級面試的關鍵。