java中string.split()默认丢弃末尾空字符串,需用split(regex, -1)保留;连续分隔符生成的空串始终保留;特殊字符作分隔符须双重转义;使用前应判空并检查数组长度。

Java 中 String.split() 是最常用的字符串分割方法,但默认行为对空字符串、连续分隔符、结尾分隔符等场景容易产生意外结果——比如返回数组中包含空字符串元素,或忽略末尾空项。正确使用需结合正则表达式规则和空值处理逻辑。
split 的基本用法与默认陷阱
split(String regex) 按正则表达式切分字符串,返回 String[]。关键点:它会自动丢弃末尾的空字符串(即“limit = 0”行为)。例如:
"a,b,,c,".split(",") → 返回 {"a", "b", "", "c"}(共 4 个元素,末尾的空串被丢弃)
这是因为默认调用的是 split(regex, 0),而 limit=0 表示“尽可能分割,但忽略结尾的空字符串”。如果想保留所有部分(包括结尾空串),必须显式指定负数 limit:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
"a,b,,c,".split(",", -1)→{"a", "b", "", "c", ""}(5 个元素,末尾空串保留) -
"a,,b".split(",", -1)→{"a", "", "b"}(中间连续分隔符生成空字符串,始终保留)
处理连续分隔符产生的空字符串
当输入含多个连续分隔符(如 "a,,b" 或 "| | |"),split 默认仍会生成空字符串元素。是否保留取决于业务需求:
- 若需过滤掉所有空字符串,可用
Arrays.stream(arr).filter(s -> !s.isEmpty()).toArray(String[]::new) - 若只过滤首尾空串,可先 trim 再 split:
s.trim().split(",", -1),再手动检查首尾 - 若要严格按字段数解析(如 CSV 行),务必用
split(regex, -1),否则字段数可能错位
特殊字符作为分隔符要转义
分隔符是正则表达式,所以 .、|、+、*、?、^、$ 等需转义,否则会报错或逻辑错误:
- 按点号分割:
"192.168.1.1".split("\.")(不是".") - 按竖线分割:
"a|b|c".split("\|")(不是"|") - 按反斜杠分割:
"a\b\c".split("\\")(Java 字符串+正则双重转义)
安全使用 split 的推荐写法
为避免 NullPointerException 和空数组误用,建议封装或遵循以下习惯:
- 判空再操作:
if (s != null && !s.isEmpty()) { String[] parts = s.split(",", -1); } - 取值前检查长度:
if (parts.length > 2) use(parts[2]); - 需要固定字段数时,用
-1保证数组长度可预测 - 对用户输入或日志行等不可信数据,考虑用
StringTokenizer(不依赖正则,更简单)或 Apache Commons Lang 的StringUtils.splitPreserveAllTokens()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










