Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
StringBuilder 对象类似于 String 对象,但可以修改它们。在内部,这些对象被视为包含一系列字符的可变长度数组。在任何时候,可以通过方法调用来更改序列的长度和内容。
除非 string builder 在使代码更简单(参见本节末尾的示例程序)或性能更好方面提供了优势,否则应始终使用 string。例如,如果需要连接大量字符串时,则添加到 StringBuilder 对象会更有效。
与 String 类一样,StringBuilder 类具有 length() 方法,该方法返回 builder 中字符序列的长度。
与 string 不同,每个 string builder 还具有 capacity (容量),即已分配的字符空间数。由 capacity() 方法返回的容量始终大于或等于长度(通常大于),并将根据需要自动扩展以适应 string builder 的添加。
| 构造函数 | 描述 |
|---|---|
StringBuilder() |
创建一个容量为 16 的空 string builder (16 个空元素)。 |
StringBuilder(CharSequence cs) |
构造一个 string builder,其中包含与指定的 CharSequence 相同的字符,以及尾随 CharSequence 的额外 16 个空元素。 |
StringBuilder(int initCapacity) |
创建具有指定初始容量的空 string builder。 |
StringBuilder(String s) |
创建一个 string builder,其值由指定的字符串初始化,另外还有 16 个空字符串尾随该字符串。 |
例如,以下代码
// creates empty builder, capacity 16
StringBuilder sb = new StringBuilder();
// adds 9 character string at beginning
sb.append("Greetings");
将生成一个长度为 9 且容量为 16 的 string builder:

StringBuilder 类有一些 String 类没有的长度和容量相关的方法:
| 方法 | 描述 |
|---|---|
void setLength(int newLength) |
设置字符序列的长度。如果 newLength 小于 length(),则截断字符序列中的最后的字符。如果 newLength 大于 length(),则在字符序列的末尾添加空字符。 |
void ensureCapacity(int minCapacity) |
确保容量至少等于指定的最小值。 |
许多操作(例如,append(),insert() 或 setLength())可以增加 string builder 中字符序列的长度,以使结果 length() 大于当前 capacity()。发生这种情况时,容量会自动增加。
StringBuilder 中有而 String 中没有的主要操作是 append() 和 insert() 方法,它们被重载以便接受任何类型的数据。每个都将其参数转换为字符串,然后将该字符串的字符追加或插入到 string builder 中的字符序列。append 方法总是在现有字符序列的末尾添加这些字符,而 insert 方法在指定点添加字符。
以下是 StringBuilder 类的许多方法。
| 方法 | 描述 |
|---|---|
StringBuilder append(boolean b) |
将参数追加到此 string builder。在追加操作发生之前,数据将转换为字符串。 |
StringBuilder delete(int start, int end) |
第一个方法在 StringBuilder 的 char 序列中删除从 start 到 end-1(包括)的子序列。第二个方法删除位于 index 的字符。 |
StringBuilder insert(int offset, boolean b) |
将第二个参数插入到 string builder 中。第一个整数参数表示要在其之前插入数据的索引。在插入操作发生之前,数据将转换为字符串。 |
StringBuilder replace(int start, int end, String s) |
替换 string builder 中的指定字符。 |
StringBuilder reverse() |
反转此 string builder 中的字符序列。 |
String toString() |
返回包含 string builder 中的字符序列的字符串。 |
StringBuilder 对象上使用任何 String 方法,只需先使用 StringBuilder 类的 toString() 方法将 string builder 转为 string。然后使用 StringBuilder(String str) 构造函数将 string 转换回 string builder。
标题为 "Strings" 一节中列出的 StringDemo 程序是一个程序的示例,如果使用 StringBuilder 代替 String 会更有效率。
StringDemo 颠倒回文。这里,再一次,是它的清单:
public class StringDemo {
public static void main(String[] args) {
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
char[] tempCharArray = new char[len];
char[] charArray = new char[len];
// put original string in an
// array of chars
for (int i = 0; i < len; i++) {
tempCharArray[i] =
palindrome.charAt(i);
}
// reverse array of chars
for (int j = 0; j < len; j++) {
charArray[j] =
tempCharArray[len - 1 - j];
}
String reversePalindrome =
new String(charArray);
System.out.println(reversePalindrome);
}
}
运行该程序会产生以下输出:
doT saw I was toD
要完成字符串反转,程序会将字符串转换为字符数组(第一个 for 循环),将数组反转为第二个数组(第二个 for 循环),然后转换回字符串。
如果将 palindrome 字符串转换为 string builder,则可以使用 StringBuilder 类中的 reverse() 方法。它使代码更简单,更易于阅读:
public class StringBuilderDemo {
public static void main(String[] args) {
String palindrome = "Dot saw I was Tod";
StringBuilder sb = new StringBuilder(palindrome);
sb.reverse(); // reverse it
System.out.println(sb);
}
}
运行此程序会产生相同的输出:
doT saw I was toD
请注意,println() 打印 string builder,如下所示:
System.out.println(sb);
因为 sb.toString() 是隐式调用的,与 println() 调用中的任何其他对象一样。
StringBuffer 类与 StringBuilder 完全相同,除了它是通过使其方法同步来实现线程安全。线程将在关于并发的课程中讨论。