字符串构建器
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日