2012-01-25 38 views
2

可能重複:
java String concatenation
StringBuilder vs String concatenation in toString() in JavaStringBuffer append()或String +?

我讀過關於追加一些文章()比+快得多,但究竟是什麼原因,我們爲什麼要使用+完全追加()?謝謝!

+3

看看http://stackoverflow.com/questions/47605/java-string-concatenation,只是搜索關於Java字符串連接,那就是已經討論過很多次的話題。 – yurib

+0

這已被多次詢問http://stackoverflow.com/q/4648607/776084 – RanRag

回答

6

+創建新的中間String ojectss作爲字符串在Java中的immutable其中作爲StringBufferappend()作品上相同的字符串,這就是爲什麼它被認爲是速度更快。但是,你應該據說比StringBuffer更快,因爲它的方法是不一樣​​StringBuffer的病房上使用從Java 5 StringBuilder

這是高層次的理論解釋。更多具體細節請看String concatenation: concat() vs "+" operator的帖子。

1

僅有concatentating 2串總(沒有循環),然後使用+通常較快。 如果您加入的字符串總數超過2個,append()會更快。

不同的是,字符串緩衝區使用一個char []內,並且具有陣列中的額外(免費)的空間來把新的內容附加到(所述陣列的增長,如果它太小)。 +操作符實際上必須創建一個正確長度的新字符串,然後將左側和右側複製到其中。

2

如果你的代碼是不是在一個循環中執行多萬次,+是完全沒問題。例外,不斷增長的字符串,用的內存重新分配了一遍又一遍:

// fine: 
for (customer: list) 
    System.out.println ("Customer: " + customer); 

// prolematic for bigger lists: 
for (word: list) 
    chain += word; 

長度爲50的100個字,你最終長度50,100,150,... 5000 - 完全250 000個字符,爲垃圾收集做了很多工作。

1

如果你正在編譯爲JDK 1.5或更高版本,串聯變成一個StringBuilder,而不是一個StringBuffer。 StringBuilder針對局部變量的連接進行了優化(即,它是無鎖的)。所以上面提到的Greg Mattes的鏈接可能是你真正想問的問題。