幾乎所有應用程式都離不開字串處理。Java 將字串設計為不可變的物件,並提供豐富的 API。本章系統梳理 java.lang.String 的建立方式、核心操作方法、不可變特性的深層含義與效能最佳實踐。
String 是 Java 唯一不需 new 即可建立物件的類別:
String s = "Hello World!"; // 字面值:編譯期進入字串常量池
// String s2 = new String("Hello World!"); // 不建議:強制在堆中建立重複物件
最佳實踐:永遠使用字面值
"..."。new String()僅在極少數需強制區分物件身份(==比較)的測試場景使用。
| 方法 | 說明 | 範例 |
|---|---|---|
length() | 字串長度 | "abc".length() → 3 |
charAt(int i) | 指定索引字元 | "abc".charAt(1) → 'b' |
substring(int begin, int end) | 子字串 [begin, end) | "abcd".substring(1,3) → "bc" |
indexOf(String str) | 子字串首次出現索引 | "hello".indexOf("ll") → 2 |
startsWith/endsWith | 前綴/後綴判斷 | "test".startsWith("te") → true |
equals(Object o) | 內容比較(必須用此,非 ==) | "a".equals("a") → true |
compareTo(String o) | 字典序比較 | "a".compareTo("b") → -1 |
trim() | 移除首尾空白 | " hi ".trim() → "hi" |
toUpperCase()/toLowerCase() | 大小寫轉換 | "Hi".toLowerCase() → "hi" |
replace(old, new) | 字串替換(回傳新字串) | "a b".replace(" ", "-") → "a-b" |
split(regex) | 正則分割 | "a,b,c".split(",") → ["a","b","c"] |
valueOf(...) | 靜態工廠:任意型別轉字串 | String.valueOf(123) → "123" |
+ 與 concat()String s = "Hello" + " " + "World"; // 編譯期優化為單一字面值
String dynamic = "Hello";
dynamic += " World"; // 運行期:編譯器隱式使用 StringBuilder
String 物件一旦建立,內容永不改變。所有「修改」操作(replace、toUpperCase、substring 等)實際上都是建立並回傳新物件:
String s = "Hello World!";
String s2 = s.replace("World", "Universe");
// s 仍為 "Hello World!"
// s2 為新物件 "Hello Universe!"
hashCode() 只需計算一次,適用於 HashMap Key。// ❌ 迴路中頻繁 + 產生大量中間物件
String result = "";
for (int i = 0; i < 10000; i++) result += i;
// ✅ 使用 StringBuilder(單執行緒)或 StringBuffer(多執行緒)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) sb.append(i);
String result = sb.toString();
官方文檔是最權威參考:
養成查閱 API 的習慣,能避免重複造輪子、發現隱藏功能(如 join()、lines()、strip() 等新版增強)。
equals()、substring()、split()、replace()。StringBuilder,避免 O(N²) 物件產生。進階延伸:Java 9+ 引入 Compact Strings(Latin-1 編碼節省空間)、
String.lines()流式處理、String.repeat()等現代化 API,建議升級 JDK 後積極採用。