Java中split()按正则分割、需转义特殊字符,String.join()静态拼接、不支持null;二者非严格互逆,因正则语义、空串处理及limit参数差异。
Java 里没有 join 方法,split 是 String 类的实例方法,但拼接字符串得靠 String.join()(静态方法)或 StringJoiner,不是反向操作。
split 的基本用法和常见陷阱
split 接收一个正则表达式作为分隔符,不是普通字符串。比如想按点号 . 拆分 "a.b.c",直接写 "a.b.c".split("."); 会返回空数组——因为 . 在正则中匹配任意字符。
- 必须转义特殊字符:
"a.b.c".split("\\."); - 连续分隔符会被合并处理:
"a,,b".split(",")返回长度为 3 的数组["a", "", "b"];但"a,,b".split(",", -1)才保留末尾空串(默认 limit=0 会丢弃结尾空串) - limit 参数影响结果:正数 limit 表示最多切出 limit-1 次,最后一项是剩余全部;负数(如
-1)表示不限制且保留所有空项;零值(默认)等价于-1但会丢弃末尾空字符串
String.join 是唯一内置的 join 方法
String.join() 是静态方法,第一个参数是分隔符,第二个是 Iterable 或可变参数 CharSequence...。它不支持对原始数组直接调用(比如不能 arr.join("-")),也不能传入 null 元素——会抛 NullPointerException。
- 正确用法:
String.join("-", "a", "b", "c")→"a-b-c" - 配合数组:
String.join(",", Arrays.asList(strArray)),或 Java 8+ 直接String.join(",", strArray)(仅限String[]) - 如果数组含
null,需先映射处理:Arrays.stream(arr).map(Objects::toString).collect(Collectors.joining(","))
需要复杂逻辑时,用 StringJoiner 更可控
当要动态添加、带前缀/后缀、或避免中间多余的分隔符时,StringJoiner 比反复用 + 或 StringBuilder 更清晰。
StringJoiner sj = new StringJoiner(",", "[", "]");
sj.add("a");
sj.add("b");
sj.add("c");
// 结果:"[a,b,c]"
-
StringJoiner不会因空值崩溃,但add(null)会加入字符串"null" - 它不自动跳过 null,也不做 trim,这些都得手动过滤
- 适合循环构建场景,比
String.join()灵活,但没后者简洁
别指望 split 和某个方法能完全互逆——正则语义、空串处









