本文目录导读:

在 Java 中,StringJoiner 是 java.util 包下的一个实用工具类,专门用于构造以分隔符分隔的字符序列,并且可以可选地添加前缀和后缀。
它本质上是对 StringBuilder 在拼接场景下的封装,目的是让代码更简洁、可读性更高。
核心构造方法
// 方式1:只指定分隔符
StringJoiner sj1 = new StringJoiner(", ");
// 方式2:指定分隔符、前缀、后缀
StringJoiner sj2 = new StringJoiner(", ", "[", "]");
常用方法
| 方法 | 作用 |
|---|---|
add(CharSequence element) |
添加一个元素,自动在元素之间插入分隔符 |
merge(StringJoiner other) |
合并另一个 StringJoiner 的内容 |
setEmptyValue(CharSequence emptyValue) |
当没有添加任何元素时,返回该值 |
toString() |
返回拼接后的完整字符串 |
快速示例
示例1:基本用法(无前缀后缀)
StringJoiner sj = new StringJoiner(", ");
sj.add("Apple");
sj.add("Banana");
sj.add("Cherry");
String result = sj.toString();
System.out.println(result); // 输出:Apple, Banana, Cherry
示例2:带前缀和后缀
StringJoiner sj = new StringJoiner(" | ", "[", "]");
sj.add("A");
sj.add("B");
sj.add("C");
System.out.println(sj); // 输出:[A | B | C]
示例3:处理空值场景
StringJoiner sj = new StringJoiner(", ");
sj.setEmptyValue("(empty)");
System.out.println(sj); // 输出:(empty)
sj.add("Hello");
System.out.println(sj); // 输出:Hello
与 Stream API 结合使用(Java 8+)
在 Stream 流式处理中,你通常不需要直接实例化 StringJoiner,因为 Collectors.joining() 底层已经封装了它。
List<String> list = Arrays.asList("Java", "Python", "Go");
// 等价于底层使用 StringJoiner
String result = list.stream()
.collect(Collectors.joining(", "));
System.out.println(result); // 输出:Java, Python, Go
如果需要前缀后缀:
String result2 = list.stream()
.collect(Collectors.joining(", ", "[", "]"));
System.out.println(result2); // 输出:[Java, Python, Go]
手动实现简易版(理解原理)
public class SimpleJoiner {
public static void main(String[] args) {
String delimiter = "-";
StringBuilder sb = new StringBuilder();
String[] items = {"A", "B", "C"};
for (int i = 0; i < items.length; i++) {
if (i > 0) sb.append(delimiter); // 在非第一个元素前加分隔符
sb.append(items[i]);
}
System.out.println(sb); // A-B-C
}
}
性能与注意事项
- 线程不安全:
StringJoiner非线程安全,多线程场景需要外部同步 - 底层实现:内部使用
StringBuilder,拼接效率与StringBuilder一致 - null 处理:
add()方法传入null时会添加字符串"null"(与StringBuilder.append(null)一致) - 不要忘记 toString:
StringJoiner的toString()方法在每次调用时重新构建字符串,大量调用可能影响性能
| 场景 | 推荐用法 |
|---|---|
| 简单拼接分隔符字符串 | StringJoiner 或 String.join() |
| 需要前缀/后缀 | StringJoiner(构造时指定) |
| Stream 流处理 | Collectors.joining() |
| 需要处理空集合 | StringJoiner.setEmptyValue() |
| 需要合并多个 Joiner | StringJoiner.merge() |
在实际开发中,如果没有特殊需求(如前缀后缀、空值处理),简单的字符串拼接也可以直接用:
String result = String.join(", ", "A", "B", "C"); // A, B, C