如果String通過"+"來拼接,如果拼接的字符串是常量,則效率會非常高,因為會進行編譯時優化,這個時候StringBuilder的append()是達不到的。
如果將String的"+"放在循環中,會創建很多的StringBuilder對象,並且執行之后會調用toString()生成新的String對象,這些對象會占用大量的內存空間
而導致頻繁的GC,從而效率變慢。
StringBuilder.append()中間過程中產生的垃圾內存大多數都是小塊的內存,鎖產生的垃圾就是拼接的對象以及擴容原來的空間(當發生String的"+"操作時,
前一次String的"+"操作的結果就成了內存垃圾,垃圾會越來越多,最后擴容也會產生很多垃圾)
注意的是,並不是String的"+"操作本身慢,而是因為大循環中大量的內存使用,開銷比較大,會導致頻繁的GC,並且很多時候程序慢是因為頻繁GC導致的
而且更多的是FULL GC,效率才會下降。
如果是少量的小字符串疊加,那么采用append()提升效率並不明顯,但是遇到大量的字符串疊加或者大字符串疊加的時候,使用append的效率會高很多。
最后有一個優化常識:
在JVM中,提倡的重點是讓這個"線程內所使用的內存"盡快結束,以便讓JVM認為它是垃圾,在Young空間就盡量釋放掉,盡量不要讓其進入Old區域,一個
重要的因素是代碼是否跑得夠快,其次是分配的空間要足夠小。
當然優化也要看場景,世事無絕對。