StringJoiner适用于带分隔符的结构化拼接,chars()用于将字符串转为IntStream处理Unicode码点;前者专为拼接设计,后者适合字符级函数式操作。

Java 中字符串拼接和字符流处理,StringJoiner 适合带分隔符的结构化拼接,chars() 则用于将字符串转为 IntStream 处理单个字符(注意是 int 类型的 Unicode 码点)。两者用途不同,别混用。
用 StringJoiner 做带分隔符的拼接
StringJoiner 是 JDK 8 引入的轻量工具类,专为“中间加固定分隔符、可选前后缀”的拼接设计,比手动用 StringBuilder 拼接更清晰、线程安全(但不用于并发修改)。
- 基本用法:传入分隔符,调用 add() 追加元素,toString() 得结果
- 支持设置前缀和后缀(比如 "[", "]"),只在非空时生效
- 可合并多个 StringJoiner(merge 方法),适用于分段构建再整合
示例:
StringJoiner sj = new StringJoiner(",", "[", "]");sj.add("a").add("b").add("c");
System.out.println(sj.toString()); // 输出:[a,b,c]
用 chars() 获取字符流做函数式处理
String.chars() 返回的是 IntStream,每个元素是 char 对应的 int 值(即 Unicode 码点),不是 Character 流。要操作字符本身,常需 (int) → (char) 转换或用 mapToObj。
立即学习“Java免费学习笔记(深入)”;
- 适合过滤、统计、映射等操作,比如找数字字符、转小写、去重等
- 注意:中文、emoji 等增补字符(4 字节 UTF-16 代理对)会被正确识别为单个码点,chars() 不会拆开代理对
- 若需真正按“字符”而非“char 单元”处理,应优先用 codePoints()
示例(提取所有数字字符):
String s = "abc123def45";String digits = s.chars()
.filter(Character::isDigit)
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
System.out.println(digits); // 输出:"12345"
什么时候选哪个?简单判断标准
- 要拼接多个字符串,且中间需要统一分隔符(如 CSV、日志参数列表)→ 用 StringJoiner
- 要分析、转换、筛选字符串里的单个字符(比如校验、清洗、统计)→ 用 chars() 或更稳妥的 codePoints()
- 只是简单拼接两三个字符串 → 直接用 + 或 String.concat() 更直观,不必上工具类或流
StringJoiner 和 chars() 都是为特定场景优化的 API,不替代 StringBuilder 或正则,用对地方才高效。


















