Java字符串分割与拼接需按场景选工具:split()须注意正则转义、limit参数控制切割次数;拼接优先用String.join(),高频动态拼接用StringBuilder并预设容量,避免循环中用+。

Java 中字符串分割和拼接要高效,关键是选对工具、避开陷阱、预判行为。不是所有场景都适合用 + 或 split(),得看数据特征和性能要求。
拆分:用对 split 的重载,尤其注意 limit 和正则转义
拆分最常用的是 String.split(String regex),但它按正则匹配,不是字面量分隔符。点号 .、竖线 |、星号 * 等必须转义,否则行为出人意料。
-
"a.b.c".split("\.")→["a", "b", "c"](.要写成"\.") -
"x|y|z".split("\|")→["x", "y", "z"] - 想保留末尾空串?用
split(",", -1),比如"a,b,".split(",", -1)得["a","b",""] - 处理
key=value类型时,value 可能含多个=,就该用split("=", 2)——只切一刀,确保parts[0]是 key,parts[1]是完整 value
拼接:优先用 String.join,复杂结构才上 StringBuilder
String.join() 是 JDK 8+ 内置静态方法,简洁安全,底层已做容量优化,适合合并数组或集合:
-
String.join("-", Arrays.asList("a", "b", "c"))→"a-b-c" -
String.join(",", list)比手写循环 + StringBuilder 更少出错,也无需预估长度 - 若需前后缀(如 JSON 数组
["a","b"]),改用new StringJoiner(",", "[", "]") - 真正高频、结构嵌套、含重复子串的拼接(如日志模板),才启用
StringBuilder:声明static final String PREFIX = "[INFO] ",预设容量,全程复用实例,避免循环内调用toString()
避开常见低效写法
很多“慢”不是语法问题,而是隐式开销或语义误用:
立即学习“Java免费学习笔记(深入)”;
- 别在日志里写
log.info("id=" + id + ", name=" + name)——即使日志关闭,字符串仍会拼接并丢弃;换成占位符log.info("id={}, name={}", id, name) - 循环中禁用
+拼接:str += item每次都新建对象,时间复杂度 O(n²);改用StringBuilder.append() - 不要用已废弃的
StringTokenizer,它不支持正则、无法处理空字段,且无维护 -
split()和join()不是严格互逆:前者按正则、受limit影响、空串处理有规则;后者只是简单连接,不还原原始分割逻辑
特殊场景:值里含分隔符怎么办
当待拆字段本身可能包含分隔符(如 CSV 中字段含逗号、配置项 value 含等号),光靠 split() 不够:
- 首选方案:约定格式,用
split("=", 2)控制切割次数 - 进阶方案:用 Apache Commons Lang 的
StringUtils.splitPreserveAllTokens(),或 Guava 的Splitter.on(',').trimResults().omitEmptyStrings() - 极端情况(如解析带引号/转义的 CSV),建议用专用库如 OpenCSV 或 Jackson CSV,不建议手写状态机


















