StringBuilder 对象类似于 String 对象,只是可以修改它们。在内部,这些对象被视为包含字符序列的可变长度数组。在任何时候,序列的长度和内容都可以通过方法调用来更改。
除非字符串生成器(string builders)在更简单的代码(请参阅本节末尾的示例程序)或更好的性能方面提供了优势,否则应始终使用字符串。例如,如果需要连接大量字符串,则附加到StringBuilder对象上会更有效。

长度和容量

StringBuilder类,如String类,具有返回在生成器的字符序列的长度的length()方法。
与字符串不同,每个字符串生成器还具有一个容量(**capacity**,即已分配的字符空间数。capacity()方法返回的容量始终大于或等于长度(通常大于),并且将根据需要自动扩展以适应字符串生成器的添加。
StringBuilder 构造器

构造器 描述
StringBuilder() 创建一个容量为16(16个空元素)的空字符串生成器。
StringBuilder(CharSequence cs) 构造一个字符串生成器,其中包含与指定字符CharSequence相同的字符,以及CharSequence后跟的额外16个空元素。
StringBuilder(int initCapacity) 创建具有指定初始容量的空字符串生成器。
StringBuilder(String s) 创建一个字符串生成器,其值由指定的字符串初始化,并在该字符串后附加16个空元素。

例如下面的代码

  1. // creates empty builder, capacity 16
  2. StringBuilder sb = new StringBuilder();
  3. // adds 9 character string at beginning
  4. sb.append("Greetings");

将产生一个长度为9,容量为16的字符串生成器。
StringBuilder类 - 图1
StringBuilder类有,而String类没有的,关于长度和容量的一些方法:
长度和容量方法

方法 描述
void setLength(int newLength) 设置字符序列的长度。如果newLength小于length(),则字符序列中的最后一个字符将被截断。如果newLength大于length(),则在字符序列的末尾添加空字符。
void ensureCapacity(int minCapacity) 确保容量至少等于指定的最小值。

多个操作(例如,append()insert(),或setLength())可以增加字符串生成字符序列的长度,使得所得的length()将是比当前capacity()更大。发生这种情况时,容量会自动增加。

StringBuilder操作

String上不可用的上的StringBuilder操作,主要是append()insert()方法,它们被重载以接受任何类型的数据。每个参数都将其参数转换为字符串,然后将该字符串的字符追加或插入到字符串生成器中的字符序列中。append()方法始终将这些字符添加到现有字符序列的末尾,而insert()方法则将这些字符添加到指定点。
这是StringBuilder类的一些方法。
各种StringBuilder方法

方法 描述
StringBuilder append(boolean b)<br />StringBuilder append(char c)<br />StringBuilder append(char[] str)<br />StringBuilder append(char[] str, int offset, int len)<br />StringBuilder append(double d)<br />StringBuilder append(float f)<br />StringBuilder append(int i)<br />StringBuilder append(long lng)<br />StringBuilder append(Object obj)<br />StringBuilder append(String s) 将参数附加到此字符串生成器。在执行追加操作之前,数据将转换为字符串。
StringBuilder delete(int start, int end)<br />StringBuilder deleteCharAt(int index) 第一种方法删除StringBuilder字符序列中从start到end-1(包括1)的子序列。

第二种方法删除位于index的字符。
StringBuilder insert(int offset, boolean b)<br />StringBuilder insert(int offset, char c)<br />StringBuilder insert(int offset, char[] str)<br />StringBuilder insert(int index, char[] str, int offset, int len)<br />StringBuilder insert(int offset, double d)<br />StringBuilder insert(int offset, float f)<br />StringBuilder insert(int offset, int i)<br />StringBuilder insert(int offset, long lng)<br />StringBuilder insert(int offset, Object obj)<br />StringBuilder insert(int offset, String s) 将第二个参数插入字符串生成器。第一个整型参数指示要在其之前插入数据的索引。在执行插入操作之前,数据将转换为字符串。
StringBuilder replace(int start, int end, String s)<br />void setCharAt(int index, char c) 替换此字符串生成器中的指定字符。
StringBuilder reverse() 反转此字符串生成器中的字符序列。
String toString() 返回一个字符串,其中包含生成器中的字符序列。

注意: 通过首先使用StringBuilder类的toString()方法将字符串生成器转换为字符串,可以在StringBuilder对象上使用任何String方法。 然后使用StringBuilder(String str)构造器将字符串转换回字符串生成器。


一个例子

在标题为“字符串”的部分中列出的StringDemo程序是该程序的示例,如果使用StringBuilder而不是String会更有效。
StringDemo反转了回文。再次,如下所示:

  1. public class StringDemo {
  2. public static void main(String[] args) {
  3. String palindrome = "Dot saw I was Tod";
  4. int len = palindrome.length();
  5. char[] tempCharArray = new char[len];
  6. char[] charArray = new char[len];
  7. // put original string in an
  8. // array of chars
  9. for (int i = 0; i < len; i++) {
  10. tempCharArray[i] =
  11. palindrome.charAt(i);
  12. }
  13. // reverse array of chars
  14. for (int j = 0; j < len; j++) {
  15. charArray[j] =
  16. tempCharArray[len - 1 - j];
  17. }
  18. String reversePalindrome =
  19. new String(charArray);
  20. System.out.println(reversePalindrome);
  21. }
  22. }

运行程序将产生以下输出:

  1. doT saw I was toD

为了完成字符串反转,该程序将字符串转换为字符数组(第一个for循环),将数组转换为第二个数组(第二个for循环),然后转换回字符串。
如果将字符串palindrome转换为字符串生成器,则可以使用StringBuilder类中的reverse()方法。它使代码更简单易读:

  1. public class StringBuilderDemo {
  2. public static void main(String[] args) {
  3. String palindrome = "Dot saw I was Tod";
  4. StringBuilder sb = new StringBuilder(palindrome);
  5. sb.reverse(); // reverse it
  6. System.out.println(sb);
  7. }
  8. }

运行此程序会产生相同的输出:

  1. doT saw I was toD

请注意,println()将打印一个字符串生成器,如下所示:

  1. System.out.println(sb);

因为sb.toString()是隐式调用的,因此与println()调用中的任何其他对象一样。


注意: 还有一个与StringBuilder完全相同的StringBuffer类,只不过由于其方法同步而具有线程安全性。线程将在并发课程中讨论。