你必須平衡可讀性和功能性。
比方說,你有以下幾種:
String str = "foo";
str += "bar";
if(baz) str += "baz";
這將創建2個字符串生成器(在這裏你只需要1,真的)加上臨時的額外字符串對象。你會更有效率,如果你去:
StringBuilder strBuilder = new StringBuilder("foo");
strBuilder.append("bar");
if(baz) strBuilder.append("baz");
String str = strBuilder.toString();
但作爲一種風格,我認爲第一個看起來就好。單個對象創建的性能優勢對我來說似乎很小。現在,如果不是3個字符串,而是10個,20個或100個,我會說性能超過這個風格。如果它是在一個循環中,肯定會使用字符串生成器,但我認爲只需幾個字符串就可以做到「馬虎」的方式,使代碼看起來更乾淨。但是......這有一個非常危險的陷阱潛藏在裏面!請閱讀下面的(暫停建立懸念... dun dun dunnnn)
有人說總是使用顯式字符串生成器。一個基本原理是你的代碼將繼續增長,並且通常會以與已經相同的方式這樣做(即他們不會花時間重構)。所以,最終你會得到10或20條語句,每條語句創建當你不需要時他們自己的建造者。所以爲了防止這種情況發生,他們總是使用一個明確的構建器。
因此,儘管在你的榜樣,它不會特別快,當有人在未來的決定,他們希望在末尾的文件擴展名,或者類似的東西,如果他們繼續使用,而不是一個StringBuilder字符串連接,他們最終會遇到性能問題。
我們還需要考慮未來。比方說,你做了Java代碼早在JDK 1.1和你有以下方法:
public String concat(String s1, String s2, String s3) {
return s1 + s2 + s3;
}
當時,那將是緩慢的,因爲StringBuilder的是不存在的。
然後在JDK 1.3中,您決定通過使用StringBuffer使其更快(StringBuilder仍然不存在)。你這樣做:
public String concat(String s1, String s2, String s3) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return sb.toString();
}
它變得更快。真棒!
現在JDK 1.5出來,和與之而來的StringBuilder(它比StringBuffer的更快)和
return s1 + s2 + s3;
自動TRANSATION到
return new StringBuilder().append(s1).append(s2).append(s3).toString();
但你沒有得到這樣的性能因爲您明確使用了StringBuffer,因此受益匪淺。所以,通過聰明,當Java比你聰明時,你已經導致了性能的下降。所以你必須記住,有些事情你不會想到。
看看這個有趣的閱讀:http://www.precisejava.com/javaperf/j2se/StringAndStringBuffer.htm – Zaki
@Zaki:這些基準實際上並不是那麼有用。更有用的是分析你的應用程序,看它是否確實有性能瓶頸。併爲您的特定用例選擇適當的算法和數據結構。 – mellamokb