1. 程式人生 > >迴圈體中用“+”拼接字串-程式碼典型缺陷分析(二)

迴圈體中用“+”拼接字串-程式碼典型缺陷分析(二)

       如上圖所示,在一個迴圈體中用“+”動態拼接字串,這是我們開發中非常的忌諱的方式,雖然它也能達到我們想要的效果但是效能上包括時間和記憶體都造成了很大程度的浪費,尤其是訪問量很高的迴圈次數很多的情況下,很容易引起記憶體溢位。

       因為“+”拼接字串,每拼接一次都是再記憶體重新開闢一個新的記憶體區域(堆裡邊),然後把得到的新的字串存在這塊記憶體,字串如果很大,迴圈次多又多,那麼浪費了很多時間和空間的開銷,切記這一點。

       正確的方法是用StringBuilder或者StringBuffer代替“+”,最好給一個預估好的初始值,預設開闢16個位元組長度的記憶體空間,因為StringBuilder和StringBufffer每次都是在已有的記憶體空間追加的字串,如果空間不足的話會重新開闢2(size+1)個位元組長度的空間,然後把新的字串存過來,所以儘可能的初始化一個預估的值,至於StringBuffer和StringBuilder的區別與效能差異可以參考我的博文:。

       如果大家用到類似sb.append(list.get("value"))這樣讀取list的元素拼接成一個字串的話,大家可以用Apache的common-lang工具包的StringUtils.join(list,",");來一步實現這個拼接而且還能指定分隔的符號,或者大家利用Google的Guava工具包裡的Joiner.on(",").join(list);能實現一樣的效果。

歡迎關注我的部落格,敬請關注程式碼典型缺陷分析系列下一篇!

如果過程中有講解的不合理或者不對或者你有更好的想法,還望大牛們留下你們的寶貴文字,以便你、我、大家更好的學習與進步!