public String substring(int beginIndex, int endIndex)
endIndex - beginIndexbeginIndex, endIndex)"hamburger".substring(4, 8) // 返回 "urge"
"smiles".substring(1, 5) // 返回 "mile"
圖示索引位置:
字符: h a m b u r g e r
索引: 0 1 2 3 4 5 6 7 8
↑ ↑
begin=4 end=8 (不包含)
String str = "HelloWorld";
String last3 = str.substring(str.length() - 3); // "rld"
String url = "https://example.com";
String domain = url.substring("https://".length()); // "example.com"
String datetime = "2024-01-15 14:30:00";
String datePart = datetime.substring(0, 10); // "2024-01-15"
String timePart = datetime.substring(11); // "14:30:00"
JDK 7 之前 substring 共享底層 char[] 數組,可能導致內存洩漏。JDK 7+ 採用 複製數組 策略,每次調用都創建新字符數組,避免了大字符串引用導致的內存無法釋放問題。
// JDK 7+ 簡化邏輯
public String substring(int beginIndex, int endIndex) {
int subLen = endIndex - beginIndex;
char[] newValue = Arrays.copyOfRange(value, beginIndex, endIndex);
return new String(newValue);
}
| 異常類型 | 觸發條件 |
|---|---|
| IndexOutOfBoundsException | beginIndex < 0 或 endIndex > length() 或 beginIndex > endIndex |
public static String safeSubstring(String str, int begin, int end) {
if (str == null) return null;
int len = str.length();
begin = Math.max(0, Math.min(begin, len));
end = Math.max(begin, Math.min(end, len));
return str.substring(begin, end);
}
substring 返回 StringsubSequence 返回 CharSequence(內部實際調用 substring)substring 即可掌握 substring 的「左閉右開」特性是關鍵。結合 length()、indexOf() 等方法可靈活處理各種字符串截取需求。注意 JDK 版本差異對內存的影響,大數據場景下避免頻繁對超長字符串調用。