比较 StringBuffer StringBuilder Formatter 和 StringJoiner

StringBufferStringBuilderFormatterStringJoiner 类是 Java SE 实用程序类,主要用于从其他信息组装字符串:

  • StringBuffer 类自 Java 1.0 以来就已存在,并提供了各种方法来构建和修改包含字符序列的缓冲区

  • 在 Java 5 中添加了 StringBuilder 类来解决原始 StringBuffer 类的性能问题。这两个分支的 API 基本相同。StringBufferStringBuilder 之间的主要区别在于前者是线程安全的并且是同步的而后者不是。

此示例显示了如何使用 StringBuilder

int one = 1;
String color = "red";
StringBuilder sb = new StringBuilder();
sb.append("One=").append(one).append(", Color=").append(color).append('\n');
System.out.print(sb);
// Prints "One=1, Colour=red" followed by an ASCII newline.

StringBuffer 类的使用方法相同:只需将 StringBuilder 改为 StringBuffer

StringBufferStringBuilder 类适用于组装和修改字符串; 即,它们提供了替换和删除字符以及添加各种字符的方法。提醒两个类特定于组装字符串的任务。

  • Formatter 类在 Java 5 中添加,并且在 C 标准库中的 sprintf 函数上进行了松散的建模。它采用带有嵌入格式说明符和其他参数序列的格式字符串,并通过将参数转换为文本并用它们代替格式说明符来生成字符串。格式说明符的详细信息说明了如何将参数转换为文本。 **

  • 在 Java 8 中添加了 StringJoiner 类。它是一种特殊用途的格式化程序,它简洁地格式化了一系列字符串,并在它们之间使用了分隔符。它采用流畅的 API 设计,可与 Java 8 流一起使用。

以下是 Formatter 用法的一些典型示例:

// This does the same thing as the StringBuilder example above
int one = 1;
String color = "red";
Formatter f = new Formatter();
System.out.print(f.format("One=%d, colour=%s%n", one, color));
// Prints "One=1, Colour=red" followed by the platform's line separator

// The same thing using the `String.format` convenience method
System.out.print(String.format("One=%d, color=%s%n", one, color));

StringJoiner 类不适用于上述任务,因此这里是一个格式化字符串数组的示例。

StringJoiner sj = new StringJoiner(", ", "[", "]");
for (String s : new String[]{"A", "B", "C"}) {
    sj.add(s);
}
System.out.println(sj);
// Prints "[A, B, C]"

可以总结 4 个类的用例:

  • StringBuilder 适合任何字符串汇编或字符串修改任务。
  • StringBuffer 使用(仅)当你需要线程安全版本的 StringBuilder 时。
  • Formatter 提供了更丰富的字符串格式化功能,但效率不如 StringBuilder。这是因为每次调用 Formatter.format(...) 都需要:
    • 解析 format 字符串,
    • 创建和填充 varargs 数组,和
    • 自动装箱任何原始类型的参数。
  • StringJoiner 使用分隔符提供了一系列字符串的简洁高效格式,但不适用于其他格式化任务。