字串連線和 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
如果要生成許多字串,建議重用 StringBuilder
s:
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 ,這是 synchronized
的 synchronized
版本。但是因為通常只有一個執行緒寫入緩衝區,所以在沒有同步的情況下使用 StringBuilder
通常會更快。
使用 concat()
方法:
String string1 = "Hello ";
String string2 = "world";
String string3 = string1.concat(string2); // "Hello world"
這將返回一個新字串,該字串為 string1,並在末尾新增了 string2。你還可以將 concat()
方法與字串文字一起使用,如下所示:
"My name is ".concat("Buyya");