字串分割是 Java 開發中高頻操作。標準庫提供了 String.split() 與 StringTokenizer 兩種主要方式,兩者在效能、功能與適用場景上存在顯著差異。本文透過完整代碼範例,深度剖析兩者特性與最佳實踐。
import java.util.Arrays;
public class TestSplit {
public static void main(String[] args) {
String originString = "5,8,7,4,3,9,1";
String[] testString = originString.split(",");
int[] test = new int[testString.length];
// 字串轉整數
for (int i = 0; i < testString.length; i++) {
test[i] = Integer.parseInt(testString[i]);
}
// 升序排序
Arrays.sort(test);
for (int j = 0; j < test.length; j++) {
System.out.println(test[j]);
}
System.out.println("next ");
// 降序輸出
for (int i = test.length - 1; i >= 0; i--) {
System.out.println(test[i]);
}
}
}
split("\\s*,\\s*") 處理帶空白的逗號)String[],便於串流處理與集合轉換Patternsplit(regex, -1) 保留import java.util.Arrays;
import java.util.StringTokenizer;
public class SplitStringTest {
public static void main(String[] args) {
String s = "5,8,7,4,3,9,1";
StringTokenizer commaTokenizer = new StringTokenizer(s, ",");
String[] result = new String[commaTokenizer.countTokens()];
int k = 0;
while (commaTokenizer.hasMoreTokens()) {
result[k++] = commaTokenizer.nextToken();
}
int[] a = new int[result.length];
for (int i = 0; i < result.length; i++) {
a[i] = Integer.parseInt(result[i]);
}
Arrays.sort(a);
for (int j = 0; j < result.length; j++) {
System.out.println(a[j]);
}
}
}
hasMoreTokens()/nextToken() 惰性處理,記憶體友善split()| 維度 | String.split() | StringTokenizer |
|---|---|---|
| 簡單分隔符效能 | 較慢(正則編譯) | 較快(無正則) |
| 複雜模式支援 | 完整支援 | 不支援 |
| 空欄位處理 | 可控制保留 | 自動忽略 |
| 記憶體模式 | 一次性建立陣列 | 迭代式逐個產生 |
| 現代化程度 | 推薦標準 | 維護模式 |
StringTokenizer 或手寫解析split()Pattern.compile(regex).splitAsStream(str) 獲得串流優勢StringTokenizer 迭代模式避免全量陣列記憶體壓力StringUtils.split() 提供更豐富的空值處理與效能優化