文档

Java™ 教程-Java Tutorials 中文版
StringBuilder 类
Trail: Learning the Java Language
Lesson: Numbers and Strings
Section: Strings

StringBuilder 类

StringBuilder 对象类似于 String 对象,但可以修改它们。在内部,这些对象被视为包含一系列字符的可变长度数组。在任何时候,可以通过方法调用来更改序列的长度和内容。

除非 string builder 在使代码更简单(参见本节末尾的示例程序)或性能更好方面提供了优势,否则应始终使用 string。例如,如果需要连接大量字符串时,则添加到 StringBuilder 对象会更有效。

长度和容量

String 类一样,StringBuilder 类具有 length() 方法,该方法返回 builder 中字符序列的长度。

与 string 不同,每个 string builder 还具有 capacity (容量),即已分配的字符空间数。由 capacity() 方法返回的容量始终大于或等于长度(通常大于),并将根据需要自动扩展以适应 string builder 的添加。

StringBuilder 构造函数
构造函数 描述
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:

string builder 的长度是它包含的字符数;string builder 的容量是已分配的字符空间数。

StringBuilder 类有一些 String 类没有的长度和容量相关的方法:

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

许多操作(例如,append()insert()setLength())可以增加 string builder 中字符序列的长度,以使结果 length() 大于当前 capacity()。发生这种情况时,容量会自动增加。

StringBuilder 操作

StringBuilder 中有而 String 中没有的主要操作是 append()insert() 方法,它们被重载以便接受任何类型的数据。每个都将其参数转换为字符串,然后将该字符串的字符追加或插入到 string builder 中的字符序列。append 方法总是在现有字符序列的末尾添加这些字符,而 insert 方法在指定点添加字符。

以下是 StringBuilder 类的许多方法。

各种 StringBuilder 方法
方法 描述
StringBuilder append(boolean b)
StringBuilder append(char c)
StringBuilder append(char[] str)
StringBuilder append(char[] str, int offset, int len)
StringBuilder append(double d)
StringBuilder append(float f)
StringBuilder append(int i)
StringBuilder append(long lng)
StringBuilder append(Object obj)
StringBuilder append(String s)
将参数追加到此 string builder。在追加操作发生之前,数据将转换为字符串。
StringBuilder delete(int start, int end)
StringBuilder deleteCharAt(int index)
第一个方法在 StringBuilder 的 char 序列中删除从 start 到 end-1(包括)的子序列。第二个方法删除位于 index 的字符。
StringBuilder insert(int offset, boolean b)
StringBuilder insert(int offset, char c)
StringBuilder insert(int offset, char[] str)
StringBuilder insert(int index, char[] str, int offset, int len)
StringBuilder insert(int offset, double d)
StringBuilder insert(int offset, float f)
StringBuilder insert(int offset, int i)
StringBuilder insert(int offset, long lng)
StringBuilder insert(int offset, Object obj)
StringBuilder insert(int offset, String s)
将第二个参数插入到 string builder 中。第一个整数参数表示要在其之前插入数据的索引。在插入操作发生之前,数据将转换为字符串。
StringBuilder replace(int start, int end, String s)
void setCharAt(int index, char c)
替换 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 完全相同,除了它是通过使其方法同步来实现线程安全。线程将在关于并发的课程中讨论。

Previous page: Comparing Strings and Portions of Strings
Next page: Summary of Characters and Strings