文档

Java™ 教程
隐藏目录
StringBuilder 类
路径: 学习Java语言
课程: 数字和字符串
部分: 字符串

StringBuilder类

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

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

长度和容量

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

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

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

例如,以下代码

// 创建一个空构建器,容量为16
StringBuilder sb = new StringBuilder();
// 在开头添加9个字符的字符串
sb.append("Greetings");

将生成一个长度为9,容量为16的字符串构建器:

字符串构建器的长度是它包含的字符数;字符串构建器的容量是已分配的字符空间数。

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

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

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

StringBuilder操作

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

以下是StringBuilder类的一些方法。

Various StringBuilder Methods
方法 描述
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的字符序列中从start到end-1(包括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)
将第二个参数插入到字符串构建器中。第一个整数参数指示在其之前插入数据的索引。在插入操作之前,数据会被转换为字符串。
StringBuilder replace(int start, int end, String s)
void setCharAt(int index, char c)
替换此字符串构建器中指定的字符。
StringBuilder reverse() 反转此字符串构建器中的字符序列。
String toString() 返回包含构建器中字符序列的字符串。

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

一个示例

在标题为“字符串”的部分中列出的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];
        
        // 把原始字符串放入字符数组中
        for (int i = 0; i < len; i++) {
            tempCharArray[i] = 
                palindrome.charAt(i);
        } 
        
        // 反转字符数组
        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();  // 反转字符串
        
        System.out.println(sb);
    }
}

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

doT saw I was toD

请注意,println()输出字符串构建器,例如:

System.out.println(sb);

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


注意: StringBuffer类与StringBuilder类完全相同,唯一的区别是它的方法是同步的,因此是线程安全的。线程将在并发课程中讨论。

上一页:比较字符串和字符串的一部分
下一页:字符和字符串总结