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
類徹底相同,但它是線程安全的,由於它的方法是同步的,線程將在關於併發的課程中討論。