首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 字符串分割完全指南:split() vs StringTokenizer 性能與用法深度對比

     編輯:Java 相關知識

核心 API:String.split() (JDK 1.4+)

基於正則表達式,功能強大、靈活,推薦**首選**。

雙重簽名

public String[] split(String regex, int limit)  // 完整控制
public String[] split(String regex)             // 等價 limit=0

limit 參數語義詳解

limit 值行為結果數組長度尾部空串
n > 0模式最多應用 n-1 次≤ n保留(最後一元素含剩餘內容)
n = 0模式應用盡可能多次任意**丟棄**
n < 0模式應用盡可能多次任意保留

經典示例:`"boo:and:foo"`

regexlimit結果
:`2{"boo", "and:foo"}
:`5{"boo", "and", "foo"}
:`-2{"boo", "and", "foo"}
o5{"b", "", ":and:f", "", ""}
o0{"b", "", ":and:f"}

等價關係:`str.split(regex, n)` ≡ `Pattern.compile(regex).split(str, n)`。

異常處理

拋出 `PatternSyntaxException`(正則語法錯誤),建議編譯期預編譯 `Pattern` 復用,運行期捕獲異常。

遺留類:StringTokenizer (JDK 1.0+)

**不推薦用於新代碼**,僅為兼容性保留。

特點

  • 非正則,僅按字符集分隔(`new StringTokenizer(str, "分隔符字符集")`)。
  • 不區分標識符/數字/引號字符串,不支持註釋跳過。
  • 兩種模式:`returnDelims=false` (默認,分隔符不返回) / `true` (分隔符作為單獨 token 返回)。
  • 內部維護游標,`hasMoreTokens()` / `nextToken()` 迭代。

示例

StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) System.out.println(st.nextToken());
// 輸出: this / is / a / test

性能與選型建議

維度String.split()StringTokenizer
功能強度正則全功能單字符分隔集
編碼複雜度需掌握正則極簡
對象創建一次性返回數組迭代器模式,逐個創建字符串
大字符串性能較優 (內部優化)較差
內存峰值較高 (持有全數組)較低 (流式)
推薦場景**所有新代碼首選 split()**;極簡分隔、超大文本流式處理、舊系統維護可用 StringTokenizer

最佳實踐模式

  1. 預編譯 Pattern:高頻調用時 `static final Pattern COLON = Pattern.compile(":");` 復用。
  2. 避免過度正則:單字符分隔用 `split("\\|")` 而非 `split("[|]")`,效率更高。
  3. 尾部空串處理:解析 CSV 等結構化數據時**必須用 `limit < 0`** 保留尾部空列,否則列數對不上。
  4. Java 8+ Stream 處理:`Arrays.stream(str.split(regex)).map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList())` 鏈式清洗。

常見坑點避雷

  • 分隔符含正則元字符 (`.|()[]{}*+?^$\\`) **必須轉義**:`split("\\.")`、`split("\\|")`。
  • 分隔符為空字符串 `""` 會拋出 `PatternSyntaxException`,需用 `split("(?!^)")` 實現逐字符分割。
  • 極長字符串 (MB 級) `split()` 會一次性創建巨大數組 OOM,改用 `Matcher.find()` 迭代或 `Scanner` 流式處理。

結語

`String.split()` 是現代 Java 字符串分割的**標準答案**:正則表達力強、API 設計完善、性能經過 JVM 深度優化。`StringTokenizer` 退居歷史舞台,僅在極受限環境或維護舊代碼時登場。掌握 `limit` 語義、預編譯 `Pattern`、尾部空串保留三大技巧,即可應對 99% 分割場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved