Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本引入的改进,可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及后续版本中更新的语言功能摘要。
请参阅JDK发布说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
StringBuilder
对象与String
对象类似,但可以被修改。在内部,这些对象被视为包含一系列字符的可变长度数组。在任何时候,可以通过方法调用来更改序列的长度和内容。
除非字符串构建器在代码简化(参见本节末尾的示例程序)或性能方面提供了优势,否则应始终使用字符串。例如,如果需要连接大量字符串,则追加到StringBuilder
对象更高效。
StringBuilder
类与String
类一样,具有返回构建器中字符序列长度的length()
方法。
与字符串不同,每个字符串构建器还具有一个容量,即已分配的字符空间数。容量由capacity()
方法返回,它始终大于或等于长度(通常大于),并将根据需要自动扩展以适应对字符串构建器的添加。
构造函数 | 描述 |
---|---|
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
上的主要操作,String
中不可用的是append()
和insert()
方法,这些方法被重载以接受任何类型的数据。每个方法将其参数转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中的字符序列中。append方法总是将这些字符添加到现有字符序列的末尾,而insert方法将字符添加到指定位置。
以下是StringBuilder
类的一些方法。
方法 | 描述 |
---|---|
StringBuilder append(boolean b) |
将参数附加到此字符串构建器。在附加操作之前,数据会被转换为字符串。 |
StringBuilder delete(int start, int end) |
第一个方法删除StringBuilder的字符序列中从start到end-1(包括start和end-1)的子序列。第二个方法删除位于index位置的字符。 |
StringBuilder insert(int offset, boolean b) |
将第二个参数插入到字符串构建器中。第一个整数参数指示在其之前插入数据的索引。在插入操作之前,数据会被转换为字符串。 |
StringBuilder replace(int start, int end, String s) |
替换此字符串构建器中指定的字符。 |
StringBuilder reverse() |
反转此字符串构建器中的字符序列。 |
String toString() |
返回包含构建器中字符序列的字符串。 |
在标题为“字符串”的部分中列出的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
类完全相同,唯一的区别是它的方法是同步的,因此是线程安全的。线程将在并发课程中讨论。