Java StringBuilder和StringBuffer用法


StringBuilderStringBufferString類的同伴類。它們表示一個可變的字元序列。StringBuffer是執行緒安全的,StringBuilder不是執行緒安全的。

兩個類都有相同的方法,除了StringBuffer中的所有方法都是同步的。StringBuilder物件是可修改的字串。StringBuilder類包含四個建構函式:

StringBuilder()
StringBuilder(CharSequence seq)
StringBuilder(int capacity)
StringBuilder(String str)

無引數建構函式建立一個預設容量為16的空StringBuilder物件。第二個建構函式使用CharSequence物件作為引數。它建立一個StringBuilder物件,其內容與指定的CharSequence相同。

第三個建構函式使用int作為引數; 它建立一個空的StringBuilder物件,其初始容量與指定的引數相同。

以下是建立StringBuilder物件的一些範例:

StringBuilder sb1  = new StringBuilder();
StringBuilder sb2  = new StringBuilder("Here is  the   content");
StringBuilder sb3  = new StringBuilder(200);

append()方法將文字新增到StringBuilder的結尾處。它可使用多種型別的引數。insert()delete()用於修改字串的內容。

長度和容量

StringBuilder類有兩個屬性:lengthcapacity。它的長度是指其內容的長度,而其容量是指它可以容納而不分配新的記憶體的最大字元數。length()capacity()方法分別返回其長度和容量。例如,

public class Main {
  public static void main(String[] args) {
    StringBuilder sb = new StringBuilder(200); // Capacity:200, length:0
    sb.append("Hello"); // Capacity:200, length:5
    int len = sb.length(); // len is assigned 5
    int capacity = sb.capacity(); // capacity is assigned 200

  }
}

轉換為字串

可以通過使用toString()方法將StringBuilder的內容作為String型別的字串值。

public class Main {
  public static void main(String[] args) {
    // Create a String object
    String s1 = new String("Hello");
    // Create a StringBuilder from of the String object s1
    StringBuilder sb = new StringBuilder(s1);

    // Append " Java" to the StringBuilder's content
    sb.append(" Java"); // Now, sb contains "Hello Java"

    // Get a String from the StringBuilder
    String s2 = sb.toString(); // s2 contains "Hello Java"

  }
}

StringBuilder有一個setLength()方法,它的新長度作為引數。如果新長度大於舊長度,則額外位置(多過的部分)用空字元填充(空字元為\u0000)。

如果新長度小於舊長度,則其內容將被截斷以適應新長度。

public class Main {
  public static void main(String[] args) {
    // Length is 5
    StringBuilder sb = new StringBuilder("Hello");

    // Now the length is 7 with last two characters as null character '\u0000'
    sb.setLength(7);

    // Now the length is 2 and the content is "He"
    sb.setLength(2);

  }
}

範例

StringBuilder類有一個reverse()方法,它用相同的字元序列替換其內容,但順序相反。以下程式碼顯示了StringBuilder類的一些方法的使用。

public class Main {
  public static void main(String[] args) {
    // Create an empty StringBuffer
    StringBuilder sb = new StringBuilder();
    printDetails(sb);

    // Append "good"
    sb.append("good");
    printDetails(sb);

    // Insert "Hi " in the beginning
    sb.insert(0, "Hi ");
    printDetails(sb);

    // Delete the first o
    sb.deleteCharAt(1);
    printDetails(sb);

    // Append "  be  with  you"
    sb.append(" be  with  you");
    printDetails(sb);

    // Set the length to 3
    sb.setLength(3);
    printDetails(sb);

    // Reverse the content
    sb.reverse();
    printDetails(sb);
  }

  public static void printDetails(StringBuilder sb) {
    System.out.println("Content: \"" + sb + "\"");
    System.out.println("Length: " + sb.length());
    System.out.println("Capacity: " + sb.capacity());

    // Print an empty line to separate results
    System.out.println();
  }
}

上面的程式碼生成以下結果。

Content: ""
Length: 0
Capacity: 16

Content: "good"
Length: 4
Capacity: 16

Content: "Hi good"
Length: 7
Capacity: 16

Content: "H good"
Length: 6
Capacity: 16

Content: "H good be  with  you"
Length: 20
Capacity: 34

Content: "H g"
Length: 3
Capacity: 34

Content: "g H"
Length: 3
Capacity: 34

字串連線運算子(+)

在開發過程中,也經常使用+運算子將字串,原始型別值或物件連線成另一個字串。

例如,

String str = "X" + "Y" + 12.56;

為了優化字串連線操作,編譯器用一個使用StringBuilder的語句替換字串連線。

String str = new StringBuilder().append("X").append("Y").append(12.56).toString();