在 Java 编程中,字符串(String)作为一种核心的数据类型,经常需要对内容进行拆分处理,以提取特定信息或进行数据转换,字符串拆分是将一个连续的字符串按照指定的分隔符切分成多个子字符串的过程,这一操作在实际开发中应用广泛,例如处理 CSV 文件、解析用户输入、解析 URL 参数等,本文将详细介绍 Java 中字符串拆分的多种方法,包括其使用场景、代码示例及注意事项,帮助开发者全面掌握字符串拆分的技巧。

使用 String.split() 方法:最直接的拆分方式
Java 提供了 String 类内置的 split() 方法,这是最常用、最直观的字符串拆分方式,该方法根据给定的正则表达式(或普通字符)将字符串拆分为字符串数组,并返回结果。
基本语法与用法
split() 方法的核心语法为:
public String[] split(String regex)
regex 是分隔符的正则表达式,使用逗号 拆分字符串:
String str = "apple,banana,orange";
String[] fruits = str.split(",");
for (String fruit : fruits) {
System.out.println(fruit);
}
// 输出:apple、banana、orange
处理复杂分隔符:正则表达式的应用
split() 方法的参数支持正则表达式,这意味着可以处理更复杂的分隔规则,拆分包含多个空格或特殊字符的字符串:
String text = "Hello world! How are you?";
String[] words = text.split("\\s+"); // \s+ 匹配一个或多个空白字符
for (String word : words) {
System.out.println(word);
}
// 输出:Hello、world!、How、are、you?
需要注意的是,正则表达式中的特殊字符(如 、、 等)需要转义,拆分以点 分隔的字符串时,应使用 \\.:
String ip = "192.168.1.1";
String[] parts = ip.split("\\.");
for (String part : parts) {
System.out.println(part);
}
// 输出:192、168、1、1
限制拆分次数:重载方法的应用
split() 方法还有一个重载版本,允许指定拆分的次数:

public String[] split(String regex, int limit)
limit 参数控制拆分的最大次数,若 limit > 0,则拆分结果最多包含 limit 个子字符串;若 limit = 0,则忽略尾部空字符串;若 limit < 0,则拆分所有可能的子字符串。
String data = "a,b,c,,";
String[] result1 = data.split(",", 3); // 限制拆分3次
System.out.println(Arrays.toString(result1)); // 输出:[a, b, c,,]
String[] result2 = data.split(",", 0); // 忽略尾部空字符串
System.out.println(Arrays.toString(result2)); // 输出:[a, b, c]
使用 StringTokenizer 类:传统拆分工具
在 Java 早期版本中,StringTokenizer 是字符串拆分的常用工具类,虽然如今更推荐使用 split() 方法,但在某些场景下(如兼容旧代码或需要按多个分隔符拆分时),StringTokenizer 仍有其价值。
基本用法
StringTokenizer 的核心功能是根据分隔符将字符串拆分为标记(token),默认情况下,分隔符包括空格、制表符、换行符和回车符,也可以自定义分隔符:
StringTokenizer tokenizer = new StringTokenizer("apple,banana;orange", ",;");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
// 输出:apple、banana、orange
与 split() 的区别
- 返回值类型:
split()返回字符串数组,而StringTokenizer通过nextToken()逐个返回标记,适合遍历场景。 - 分隔符处理:
StringTokenizer会连续的分隔符视为一个分隔符(如"a,,b"拆分为[a, b]),而split()默认会将每个分隔符视为独立的分隔(如split(",")会拆分出空字符串)。 - 功能限制:
StringTokenizer不支持正则表达式,灵活性较低。
使用 Java 8 Stream API:函数式拆分方式
Java 8 引入的 Stream API 为字符串拆分提供了函数式风格的解决方案,尤其适合需要对拆分结果进行进一步处理的场景(如过滤、转换等)。
基本拆分与遍历
通过 Pattern.compile() 和 splitAsStream() 方法,可以将字符串拆分为 Stream<String>,并进行流式操作:
import java.util.regex.Pattern;
import java.util.stream.Stream;
String text = "Java,Python;C++|Go";
Pattern pattern = Pattern.compile("[,;|]"); // 多个分隔符用正则表达式表示
Stream<String> languages = pattern.splitAsStream(text);
languages.forEach(System.out::println);
// 输出:Java、Python、C++、Go
结合其他操作:过滤与转换
Stream API 的优势在于可以无缝衔接其他中间操作,拆分字符串并过滤掉空字符串:

String data = "a,b,,c,";
Pattern.compile(",").splitAsStream(data)
.filter(s -> !s.isEmpty()) // 过滤空字符串
.map(String::toUpperCase) // 转换为大写
.forEach(System.out::println);
// 输出:A、B、C
特殊场景处理:注意事项与最佳实践
在实际开发中,字符串拆分可能遇到各种边界情况,合理处理这些情况是保证代码健壮性的关键。
处理转义字符与正则表达式冲突
当分隔符本身是正则表达式的特殊字符时,必须使用 \\ 进行转义,拆分以 分隔的字符串:
String str = "a|b|c";
String[] parts = str.split("\\|"); // 必须转义 |
避免空字符串数组与空指针异常
- 若拆分后的字符串数组为空(如
str.split("")会拆分每个字符),需检查数组长度。 - 若输入字符串为
null,直接调用split()会抛出NullPointerException,应先进行判空:String input = null; if (input != null) { String[] result = input.split(","); // 处理结果 }
性能考量:大数据量下的拆分选择
对于大量字符串的拆分操作,split() 方法会一次性生成整个数组,可能占用较多内存,若仅需遍历结果而不需要随机访问,可优先考虑 StringTokenizer 或 Stream API 的流式处理,以减少内存消耗。
Java 中字符串拆分的方法多样,开发者可根据具体场景选择合适的工具:
- 简单拆分:优先使用
String.split(),代码简洁,功能强大。 - 兼容旧代码或多分隔符拆分:可考虑
StringTokenizer,但需注意其局限性。 - 复杂处理(过滤、转换等):推荐 Java 8 Stream API,函数式风格更灵活。
无论选择哪种方法,都需要注意分隔符的转义、空字符串处理及性能问题,以确保代码的正确性和高效性,通过灵活运用这些技巧,可以轻松应对字符串拆分的各种需求。



















