StringTokenizer 是过时的字符串拆分工具,不支持正则、空字段和分隔符控制;推荐优先使用 String.split(),复杂场景用 Pattern/Matcher。

StringTokenizer 是 Java 中一个过时但仍在运行的字符串拆分工具,它不支持正则表达式、不能处理空字段、也不推荐在新代码中使用。如果你只是想快速按固定分隔符切分且不关心空串或边界情况,它能用;但遇到 ""、"a,,b" 或需要保留分隔符时,会出问题。
StringTokenizer 基本用法和常见陷阱
它把字符串看作“令牌流”,每次调用 nextToken() 拿一个,靠 hasMoreTokens() 判断是否还有。它默认把空格、制表符、换行等都当分隔符,除非显式指定。
- 默认分隔符是
" \t\n\r\f"(空格、tab、回车、换行、换页),不是仅空格 - 连续分隔符会被合并处理,
"a,,b"用","分隔时只返回"a"和"b",中间的空串直接丢弃 - 没有
split()那样的limit参数,无法控制拆分次数 - 不支持正则,比如想用
"\\s+"或"[;:,]+"就得换别的方法
替代方案:String.split() 更安全可控
绝大多数场景下,应优先用 String.split(String regex) —— 它基于正则,支持空串保留、限制拆分数量,且语义更明确。
String s = "a,,b,c";
String[] parts = s.split(",", -1); // 第二个参数 -1 表示不限制,保留末尾空串
// 结果:["a", "", "b", "c"]
- 用
split(",", 0)会自动丢弃末尾空串(Java 默认行为) - 用
split(",", -1)强制保留所有分割结果,包括空字符串 - 若分隔符本身是正则元字符(如
"."、"|"、"+"),必须转义:"\\."
需要正则或复杂逻辑时用 Pattern + Matcher
当拆分逻辑涉及上下文(例如跳过引号内的逗号)、或需提取带结构的片段(如键值对),StringTokenizer 和 split() 都不够用,该上 Pattern。
立即学习“Java免费学习笔记(深入)”;
Pattern p = Pattern.compile("([^,]+)");
Matcher m = p.matcher("name:jack,age:25,city:shanghai");
while (m.find()) {
System.out.println(m.group(1)); // 输出每个非逗号字段
}
-
StringTokenizer完全无法处理这种模式匹配需求 -
split()只能做“一刀切”,没法跳过特定区域 - 正则方式灵活,但要注意性能:频繁调用建议复用
Pattern实例
真正容易被忽略的是:很多老项目还在用 StringTokenizer 是因为习惯了它的 while 循环写法,但没人检查过它是否正确处理了空字段或特殊分隔符。只要输入不可控,它就可能漏数据——这点比性能问题更致命。










