StringBuilder 类

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

除非字符串 构建器在更简单的代码(请参阅本节末尾的示例程序)或更好的性能方面提供了优势,否则应始终使用字符串。例如,如果您需要连接大量字符串,则附加到StringBuilder对象的效率更高。

Long 度和容量

StringBuilder类与String类一样,具有length()方法,该方法返回构建器中字符序列的 Long 度。

与字符串 不同,每个字符串 构建器还具有容量,即已分配的字符空间的数量。 capacity()方法返回的容量始终大于或等于 Long 度(通常大于),并且将在必要时自动扩展以适应对字符串 生成器的添加。

  • StringBuilder构造函数*
ConstructorDescription
StringBuilder()创建一个容量为 16(16 个空元素)的空字符串 生成器。
StringBuilder(CharSequence cs)构造一个字符串 生成器,其中包含与指定的CharSequence相同的字符,再加上在CharSequence后面的 16 个空元素。
StringBuilder(int initCapacity)创建具有指定初始容量的空字符串 构建器。
StringBuilder(String s)创建一个字符串 构建器,其值由指定的字符串 初始化,并在该字符串 后附加 16 个空元素。

例如下面的代码

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

将产生一个 Long 度为 9,容量为 16 的字符串 生成器。

字符串 生成器的 Long 度是它包含的字符数;字符串 生成器的容量是已分配的字符空间的数量。

StringBuilder类具有一些与 Long 度和容量有关的方法,而String类则没有:

Long 度和容量方法

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

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

StringBuilder Operations

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

这是StringBuilder类的许多方法。

各种StringBuilder方法

MethodDescription
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)将参数附加到此字符串 生成器。在执行追加操作之前,数据将转换为字符串。
StringBuilder delete(int start, int end) StringBuilder deleteCharAt(int index)第一种方法删除StringBuilder的 char 序列中从 start 到 end-1(包括 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)将第二个参数插入字符串 生成器。第一个整数参数指示要在其之前插入数据的索引。插入操作之前,数据将转换为字符串。
StringBuilder replace(int start, int end, String s) void setCharAt(int index, char c)替换此字符串 生成器中的指定字符。
StringBuilder reverse()反转此字符串 生成器中的字符序列。
String toString()返回一个字符串,其中包含构建器中的字符序列。

Note:

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

An Example

在标题为“字符串”的部分中列出的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字符串 转换为字符串 生成器,则可以使用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()打印字符串 生成器,如下所示:

System.out.println(sb);

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

Note:

还有一个StringBuffer类与StringBuilder类完全相同,除了通过同步其方法来保证线程安全之外。线程将在并发类中讨论。