2012-01-04 52 views
16

這是壞的嗎?Java字符串連接效率

(想象一下,這是更大的)

int count; 
//done something to count 
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count; 

還是更在一個StringBuilder/StringBuffer的?

回答

25

Java編譯器將其轉換成StringBuilder的增加重複字符串連接的性能。 http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#15.18.1.2

當你在一個循環編譯器中連接時,它不能自己替換StringBuilder,那你應該考慮從串聯到StringBuilder。

+0

這篇文章怎麼樣?(http://www.pellegrino.link/2015/08/22/string-concatenation-with-java-8.html)? – gaheinrichs 2016-07-12 21:41:30

+0

「當你在一個循環編譯器中連接時,它不能代替StringBuilder本身,這是你應該考慮從串聯到StringBuilder」 – user765635 2016-07-14 03:03:39

+0

_Its當你連接循環時** **編譯器不能用StringBuilder替代本身。那時你應該考慮**從串聯切換到**使用** StringBuilder_ – Trunk 2017-11-12 00:37:44

3

這將是更可讀如果使用StringBuilder/StringBuffer(依據您的應用程序的線程模型)

,如果你寫

String str = "abc"; 
    str+="def"; 

內部,它會爲同

創建 StringBuilder
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 
    10: aload_1 
    11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    14: ldC#6; //String def 
    16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    22: astore_1 
1

(想象它是bigg ER)...使用「+」操作符

字符串連接創建許多臨時 對象和增加垃圾收集。使用StringBuffer類 更高效。

這裏更多:http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html

StringBuffer strBuf = new StringBuffer(); 
strBuf.append("this"); 
strBuf.append("is"); 
strBuf.append("my"); 
strBuf.append("string"); 
strBuf.append("and"); 
strBuf.append(this.methodCall()); 
strBuf.append(" answer "); 
strBuf.append("is : "); 
strBuf.append(count); 

可以涉及:String concatenation: concat() vs "+" operator

+0

是的,但是這種情況只有當你在一個循環concatinating,而不是一次性建立字符串? – 2012-01-04 11:36:11

+0

有什麼區別?如果你做了很多級聯,請使用StringBuffer – JohnJohnGa 2012-01-04 11:36:58

+3

引用[你的源代碼](http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html)總是有幫助的。 – 2012-01-04 11:37:40

1

你應該更喜歡的StringBuilder在字符串連接,因爲你必須被添加到字符串的方法調用和變量。

但是,像「this」和「is」這樣的簡單字符串的數量對性能沒有影響,因爲編譯器會有效地處理它們並創建以字節碼結尾的實際字符串。說了這些,那些提到的Strings在最後的演出上沒有任何開銷。

1

當我寫這樣的字符串時,我不認爲它對性能有什麼影響 - 編譯器會優化它。

4

不,沒關係。如果你使用Sun的Java 6編譯器,它實際上會使用StringBuilder。

閱讀本article

4

Java 5中的StringBuffer的Javadoc狀態。0

由於StringBuilder類支持所有相同的操作,但它的速度更快,因爲它不執行同步,所以通常應優先使用StringBuilder類。

編譯器將字符串文字結合,從而它一樣寫

String myString = "this is my stringand " + this.methodCall() + " answer is : " + count; 

這是一樣的

String myString = new StringBuilder().append("this is my stringand ").append(methodCall()).append(" answer is : ").append(count).toString(); 

,除非你需要我就不會擔心性能消除系統中的垃圾,在這種情況下,您不會在這裏使用字符串。 (它是不太可能的,你需要擔心它)