方法一:String.split(String regex, int limit)(JDK 1.4+)
基於正則表達式,功能強大但需注意特殊字符轉義。
基本用法
String src = "1,2,3,4,5";
String[] arr = src.split(","); // [1,2,3,4,5]
String[] arr3 = src.split(",", 3); // 限制最多 3 段 → [1,2,3,4,5]
特殊字符轉義規則
| 分隔符 | 正則寫法 | 說明 |
| . | \\. | 點號需雙轉義 |
| | | \\| | 管道符需轉義 |
| * | \\* | 星號需轉義 |
| \ | \\\\ | 反斜槓需四重轉義 |
多重分隔符
"Java string-split#test".split(" |-|#") // 以空格、-、# 任一分割 → [Java, string, split, test]
方法二:StringTokenizer(JDK 1.0+,遺留類)
不支援正則,僅按單字符分隔,性能較高但功能受限。
基本用法
StringTokenizer st = new StringTokenizer("192.168.128.33", ".");
while (st.hasMoreTokens()) {
System.out.print(st.nextToken() + " "); // 192 168 128 33
}
關鍵差異:空 Token 處理
// 輸入 "192.168..33"
split(".") → [192, 168, "", 33] // 保留空段
StringTokenizer → [192, 168, 33] // 自動忽略空段
警告:若業務依賴空段語義(如 CSV 空列),StringTokenizer 會導致數據丟失。
性能對比與選型建議
| 維度 | String.split | StringTokenizer |
| 算法複雜度 | O(m×n) 正則匹配 | O(n) 線性掃描 |
| 功能豐富度 | 正則、限制段數、多重分隔符 | 單字符分隔、無正則 |
| 空段保留 | 是 | 否(忽略) |
| 推薦場景 | 高頻、大數據量 ETL 解析 → StringTokenizer;通用業務、需正則 → split |
現代替代方案
java.util.regex.Pattern 編譯複用:Pattern.compile(regex).split(input) 避免重複編譯
- Apache Commons Lang
StringUtils.split():非正則、高性能、空段可控
- Java 8+
String.splitAsStream():流式處理,配合 Filter/Map 更優雅
- 上一篇文章: MyBatis 一級緩存機制詳解:SqlSession 級別的查詢加速與髒讀防範
- 下一篇文章: Java 爬蟲實戰:基於正則表達式批量抓取網頁圖片完整代碼實現
Copyright ©
程式碼之家 All Rights Reserved