String substring(int beginIndex) // 從 beginIndex 截取到末尾
String substring(int beginIndex, int endIndex) // 截取 [beginIndex, endIndex) 左閉右開區間
"1234567890abcdefgh".substring(10) // "abcdefgh"
"1234567890abcdefgh".substring(0, 9) // "123456789"
public static String removeSubstring(String source, String target) {
if (source == null || target == null || target.isEmpty()) return source;
if (source.startsWith(target)) {
return source.substring(target.length());
}
if (source.endsWith(target)) {
return source.substring(0, source.length() - target.length());
}
int idx = source.indexOf(target);
if (idx >= 0) {
return source.substring(0, idx) + source.substring(idx + target.length());
}
return source; // 未找到
}
// 測試
String s = "this is my original string";
System.out.println(removeSubstring(s, " original")); // "this is my string"
substring 共享底層 char[],長字符串截取小片段導致大數組無法 GC;substring **複製新數組**,徹底解決洩漏;new String(str.substring(...)) 強制複製。| 調用 | 結果 | 異常 |
|---|---|---|
| s.substring(0) | 原字符串 | 無 |
| s.substring(s.length()) | "" | 無 |
| s.substring(-1) | — | StringIndexOutOfBoundsException |
| s.substring(0, s.length()+1) | — | StringIndexOutOfBoundsException |
| s.substring(5, 3) | — | StringIndexOutOfBoundsException |
char[]/StringBuilder 手動操作避免分配;split() 內部同樣創建大量子串,大數據量慎用。掌握 substring 的語義、版本差異與邊界條件,是 Java 字符串處理的基本功。