字符串构建器
StringBuilder 类
String
对象类似于 StringBuilder
对象,只是它们可以被修改。在内部,这些对象被视为包含字符序列的可变长度数组。在任何时候,序列的长度和内容都可以通过方法调用进行更改。
除非字符串构建器在更简单的代码(参见本节末尾的示例程序)或更好的性能方面提供了优势,否则应始终使用字符串。在 Java SE 9 之前,如果您需要连接大量字符串,则将字符串追加到 StringBuilder 对象可能更有效。Java SE 9 中的字符串连接已优化,使连接比 StringBuilder
追加更有效。
长度和容量
与 String
类类似,StringBuilder
类也具有 length()
方法,该方法返回构建器中字符序列的长度。
与字符串不同,每个字符串构建器还具有容量,即已分配的字符空间数。容量由 capacity()
方法返回,它始终大于或等于长度(通常大于),并且会根据需要自动扩展以适应字符串构建器的添加。
您可以使用 StringBuilder
类的以下构造函数
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");
将生成一个长度为 9、容量为 16 的字符串构建器
StringBuilder
的长度和容量StringBuilder
类有一些与长度和容量相关的,String
类没有的方法
void setLength(int newLength)
: 设置字符序列的长度。如果newLength
小于length()
,则字符序列中的最后几个字符将被截断。如果newLength
大于length()
,则在字符序列的末尾添加null
字符。void ensureCapacity(int minCapacity)
: 确保容量至少等于指定的最小值。
许多操作(例如,append()
、insert()
或 setLength()
可以增加字符串构建器中字符序列的长度,以使结果 length()
大于当前 capacity()
。当这种情况发生时,容量会自动增加。
StringBuilder 操作
在 StringBuilder
上不可用于 String
的主要操作是 append()
和 insert()
方法,它们被重载以接受任何类型的数据。每个方法将其参数转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中的字符序列中。append 方法始终在现有字符序列的末尾添加这些字符,而 insert 方法在指定的位置添加这些字符。
以下是 StringBuilder
类的一些方法。
- 您可以使用
append()
方法将任何基本类型或对象追加到字符串构建器。数据在追加操作发生之前被转换为字符串。 delete(int start, int end)
方法删除StringBuilder
的字符序列中从start
到end - 1
(含)的子序列。- 您可以使用
deleteCharAt(int index)
方法删除索引index
处的char
。 - 您可以使用其中一个
insert(int offset)
方法在给定的offset
处插入任何基本类型或对象。这些方法将要插入的元素作为第二个参数。数据在插入操作发生之前被转换为字符串。 - 您可以使用
replace(int start, int end, String s)
和setCharAt(int index, char c)
方法替换字符。 - 您可以使用
reverse()
方法反转此字符串构建器中的字符序列。 - 您可以使用
toString()
方法返回一个包含构建器中字符序列的字符串。
注意:您可以对
StringBuilder
对象使用任何String
方法,方法是首先使用toString()
方法将字符串构建器转换为字符串。然后使用StringBuilder(String string)
构造函数将字符串转换回字符串构建器。
StringBuilder 的实际应用
在标题为“字符串”的部分中列出的 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
循环),然后转换回字符串。
如果您将回文字符串转换为字符串构建器,则可以使用 reverse()
方法在 StringBuilder
类中。它使代码更简单,更易于阅读
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
调用中的任何其他对象一样。
注意:还有一个
StringBuffer
类,它与StringBuilder
类完全相同,只是它通过使其方法同步而线程安全。除非您绝对需要线程安全的类,否则您不需要使用StringBuffer
。
最后更新: 2021年9月14日