字串連線和 StringBuilders

可以使用+運算子執行字串連線。例如:

String s1 = "a";
String s2 = "b";
String s3 = "c";
String s = s1 + s2 + s3; // abc

通常,編譯器實現將使用涉及引擎蓋下的 StringBuilder方法來執行上述串聯。編譯時,程式碼看起來類似於下面的程式碼:

StringBuilder sb = new StringBuilder("a");
String s = sb.append("b").append("c").toString();

StringBuilder 有幾種過載方法可以追加不同型別,例如,附加 int 而不是 String。例如,實現可以轉換:

String s1 = "a";
String s2 = "b";    
String s = s1 + s2 + 2; // ab2

以下內容:

StringBuilder sb = new StringBuilder("a");
String s = sb.append("b").append(2).toString();

上面的例子說明了一個簡單的連線操作,它在程式碼中的一個地方有效地完成。串聯涉及 StringBuilder 的單個例項。在某些情況下,連線是以累積方式執行的,例如迴圈:

String result = "";
for(int i = 0; i < array.length; i++) {
    result += extractElement(array[i]);
}
return result;

在這種情況下,通常不會應用編譯器優化,每次迭代都會建立一個新的 StringBuilder 物件。這可以通過顯式轉換程式碼以使用單個 StringBuilder 來優化:

StringBuilder result = new StringBuilder();
for(int i = 0; i < array.length; i++) {
    result.append(extractElement(array[i]));
}
return result.toString();

StringBuilder 將初始化為只有 16 個字元的空白空間。如果你事先知道要構建更大的字串,那麼事先用足夠的大小初始化它可能是有益的,這樣內部緩衝區就不需要調整大小:

StringBuilder buf = new StringBuilder(30); // Default is 16 characters
buf.append("0123456789");
buf.append("0123456789"); // Would cause a reallocation of the internal buffer otherwise
String result = buf.toString(); // Produces a 20-chars copy of the string

如果要生成許多字串,建議重用 StringBuilders:

StringBuilder buf = new StringBuilder(100);
for (int i = 0; i < 100; i++) {
    buf.setLength(0); // Empty buffer
    buf.append("This is line ").append(i).append('\n');
    outputfile.write(buf.toString());
}

如果(且僅當)多個執行緒正在寫入同一緩衝區,請使用 StringBuffer ,這是 synchronizedsynchronized 版本。但是因為通常只有一個執行緒寫入緩衝區,所以在沒有同步的情況下使用 StringBuilder 通常會更快。

使用 concat() 方法:

String string1 = "Hello ";
String string2 = "world";
String string3 = string1.concat(string2);  // "Hello world"

這將返回一個新字串,該字串為 string1,並在末尾新增了 string2。你還可以將 concat() 方法與字串文字一起使用,如下所示:

"My name is ".concat("Buyya");