Java™ 教程(StringBuilder類)

StringBuilder類

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的字符串構建器:併發

objects-stringBuffer.gif

StringBuilder類有一些與String類沒有的長度和容量相關的方法:oracle

方法 描述
void setLength(int newLength) 設置字符序列的長度;
若是newLength小於length(),則截斷字符序列中的剩餘字符;
若是newLength大於length(),則在字符序列的末尾添加null字符。
void ensureCapacity(int minCapacity) 確保容量至少等於指定的最小值。

許多操做(例如,append()insert()setLength())能夠增長字符串構建器中字符序列的長度,從而使結果length()大於capacity(),發生這種狀況時,容量會自動增長。app

StringBuilder操做

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

上一篇:比較字符串和字符串的部分

下一篇:自動裝箱和拆箱

相關文章
相關標籤/搜索