java.lang.String 是 Java 使用頻率最高的類別之一,也是不可變物件。掌握其核心 API 能大幅提升字串處理效率與可讀性。本文以實戰導向,分類整理 11 大常用方法,並附上完整可執行範例與輸出對照。
| 分類 | 方法 | 說明 | 回傳型別 |
|---|---|---|---|
| 連接 | concat(String) | 尾部追加字串 | String |
join(CharSequence, CharSequence...) (Java 8+) | 以分隔符連接多字串/集合 | String | |
| 替換 | replace(CharSequence, CharSequence) | 字面值替換(全部),不支援正則 | String |
replaceAll(String regex, String) | 正則替換(全部) | String | |
replaceFirst(String regex, String) | 正則替換(首次) | String | |
| 切割/子字串 | substring(int beginIndex) | 從索引到結尾 | String |
substring(int begin, int end) | 左閉右開區間 [begin, end) | String | |
| 大小寫轉換 | toLowerCase() / toUpperCase() | 預設 Locale,或指定 Locale | String |
toLowerCase(Locale) / toUpperCase(Locale) | 指定語系規則(如土耳其語 I/ı 處理) | String | |
| 修剪 | trim() | 移除首尾空白字元(<= U+0020) | String |
| 長度 | length() | 字元數(UTF-16 code units) | int |
| 常駐池 | intern() | 放入/取得字串常量池引用 | String |
public class StringMethodsDemo {
public static void main(String[] args) {
String str = "78454545855ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>";
System.out.println("原始字串長度: " + str.length());
System.out.println("原始字串: [" + str + "]");
System.out.println();
// 1. concat() - 字串連接
str = str.concat(str);
printStep(1, "concat()", str);
// 2. intern() - 常駐池
str = str.intern();
printStep(2, "intern()", str);
// 3. replace() - 字面值替換(全部)
str = str.replace("8", "發財");
printStep(3, "replace('8', '發財')", str);
// 4. replaceAll() - 正則替換(全部)
str = str.replaceAll("f", "阿彌陀佛");
printStep(4, "replaceAll('f', '阿彌陀佛')", str);
// 5. replaceFirst() - 正則替換(首次)
str = str.replaceFirst("7", "七七四十九天");
printStep(5, "replaceFirst('7', '七七四十九天')", str);
// 6. substring(int) - 從索引 20 到結尾
str = str.substring(20);
printStep(6, "substring(20)", str);
// 7. substring(int, int) - 區間 [25, 35)
str = str.substring(25, 35);
printStep(7, "substring(25, 35)", str);
// 8. toLowerCase() - 轉小寫
str = str.toLowerCase();
printStep(8, "toLowerCase()", str);
// 9. toUpperCase() - 轉大寫
str = str.toUpperCase();
printStep(9, "toUpperCase()", str);
// 10. trim() - 修剪首尾空白
str = str.trim();
printStep(10, "trim()", str);
// 11. length() - 長度
int len = str.length();
printStep(11, "length()", String.valueOf(len));
}
private static void printStep(int step, String method, String result) {
System.out.printf("第 %2d 步 %s:%n%s%n%n", step, method, result);
}
}
原始字串長度: 72
原始字串: [78454545855ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 1 步 concat():
[78454545855ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>78454545855ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 2 步 intern():
[78454545855ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>78454545855ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 3 步 replace('8', '發財'):
[7發財454545發財55ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>7發財454545發財55ksdjnf dnfdksf klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 4 步 replaceAll('f', '阿彌陀佛'):
[7發財454545發財55ksdjn阿彌陀佛 dn阿彌陀佛dks阿彌陀佛 klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>7發財454545發財55ksdjn阿彌陀佛 dn阿彌陀佛dks阿彌陀佛 klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 5 步 replaceFirst('7', '七七四十九天'):
[七七四十九天發財454545發財55ksdjn阿彌陀佛 dn阿彌陀佛dks阿彌陀佛 klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>7發財454545發財55ksdjn阿彌陀佛 dn阿彌陀佛dks阿彌陀佛 klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 6 步 substring(20):
[djn阿彌陀佛 dn阿彌陀佛dks阿彌陀佛 klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>7發財454545發財55ksdjn阿彌陀佛 dn阿彌陀佛dks阿彌陀佛 klkADE TGTH eiru oaK L!@@$#%$^*&(*()()><?<>>>]
第 7 步 substring(25, 35):
[ADE TGTH e]
第 8 步 toLowerCase():
[ade tgth e]
第 9 步 toUpperCase():
[ADE TGTH E]
第 10 步 trim():
[ADE TGTH E]
第 11 步 length():
[10]
| 方法 | 說明 | 範例 |
|---|---|---|
isBlank() | 判斷是否為空白(含空字串、空白字元) | " \t\n".isBlank() → true |
strip() | Unicode 感知修剪(比 trim() 更完整) | "\u2000Hello\u2000".strip() → "Hello" |
stripLeading() / stripTrailing() | 單側 Unicode 修剪 | - |
repeat(int) | 重複字串 N 次 | "ab".repeat(3) → "ababab" |
lines() | 按行分割回傳 Stream | "a\nb\nc".lines().toList() → [a, b, c] |
indent(int) (Java 12+) | 每行縮進/減縮 | "a\nb".indent(2) → " a\n b" |
transform(Function) (Java 12+) | 鏈式轉換 | s.transform(String::toUpperCase).transform(s -> "[" + s + "]") |
String 不可變,迴圈中 += 會產生大量中間物件。replaceAll 編譯正則有開銷:同一正則重複使用時,預編譯 Pattern 並用 matcher.replaceAll()。substring 在 Java 7+ 為 O(1) 複製引用(不再共享 char[]),但極長字串取小段仍保留原陣列引用,可能阻礙 GC,必要時 new String(sub) 強制複製。String API 設計遵循「不可變、功能單一、鏈式呼叫」原則。實務上建議:
+(編譯器優化為 StringBuilder)StringBuilder/StringJoinerPatternisBlank()/strip()/repeat()熟練這 11+7 個方法,應付 95% 字串處理場景綽綽有餘。