StringBuilder对象与String对象相似,只是它能够被修改,在内部,这些对象被视为包含一系列字符的可变长度数组,在任什么时候候,能够经过方法调用来改变序列的长度和内容。html
除非字符串构建器在更简单的代码(参见本节末尾的示例程序)或更好的性能方面提供优点,不然应始终使用字符串,例如,若是须要链接大量字符串,则附加到StringBuilder
对象会更有效。java
与String
类同样,StringBuilder
类有一个length()
方法,该方法返回构建器中字符序列的长度。segmentfault
与字符串不一样,每一个字符串构建器还具备容量,即已分配的字符空间数,capacity()
方法返回的容量始终大于或等于长度(一般大于),并将根据须要自动扩展以适应字符串构建器的添加。api
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
类有一些与String
类没有的长度和容量相关的方法:oracle
方法 | 描述 |
---|---|
void setLength(int newLength) |
设置字符序列的长度; 若是 newLength 小于length() ,则截断字符序列中的剩余字符;若是 newLength 大于length() ,则在字符序列的末尾添加null 字符。 |
void ensureCapacity(int minCapacity) |
确保容量至少等于指定的最小值。 |
许多操做(例如,append()
、insert()
或setLength()
)能够增长字符串构建器中字符序列的长度,从而使结果length()
大于capacity()
,发生这种状况时,容量会自动增长。app
String
中不可用的StringBuilder
上的主要操做是append()
和insert()
方法,它们被重载以接受任何类型的数据,每一个都将其参数转换为字符串,而后将该字符串的字符追加或插入字符串构建器中的字符序列,append
方法老是在现有字符序列的末尾添加这些字符,而insert
方法在指定点添加字符。函数
如下是StringBuilder
类的许多方法。
方法 | 描述 |
---|---|
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 (包括)的子序列;第二种方法删除位于索引处的字符。 |
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
对象上使用任何String
方法,首先使用StringBuilder
类的toString()
方法将字符串构建器转换为字符串,而后使用StringBuilder(String str)
构造函数将字符串转换回字符串构建器。
标题为“字符串”一节中列出的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()
调用中的任何其余对象同样。
还有一个StringBuffer
类与StringBuilder
类彻底相同,但它是线程安全的,由于它的方法是同步的,线程将在关于并发的课程中讨论。