android string拼接字符串_为什么阿里巴巴不建议在循环体中使用+进行字符串拼接?...
之前在閱讀《阿里巴巴Java開發手冊》時,發現有一條是關于循環體中字符串拼接的建議,具體內容如下:
那么我們首先來用例子來看看在循環體中用 + 或者用 StringBuilder 進行字符串拼接的效率如何吧(JDK版本為 jdk1.8.0_201)。
執行結果如下:
為什么這兩種方法的時間會差這么多呢?接下來讓我們一起進一步研究。
為什么 StringBuilder 比 + 快這么多?
從字節碼層面來看下,為什么循環體中字符串拼接 StringBuilder 比 + 快這么多?
使用 javac StringConcatDemo.java 命令編譯源文件,使用 javap -c StringConcatDemo 命令查看字節碼文件的內容。
其中 addMethod() 方法的字節碼如下:
可以看出,第 8 行到第 38 行構成了一個循環體:在第 8 行的時候做條件判斷,如果不滿足循環條件,則跳轉到 41 行。編譯器做了一定程度的優化,在 11 行 new 了一個 StringBuilder 對象,然后再 19 行、23 行、28 行進行了三次 append() 方法的調用,不過每次循環都會重新 new 一個 StringBuilder 對象。
再來看 stringBuilderMethod() 方法的字節碼:
13 行到 30 行構成了循環體,可以看出,在第4行(循環體外)就構建好了 StringBuilder 對象,然后再循環體內只進行 append() 方法的調用。
由此可以看出,在 for 循環中,使用 + 進行字符串拼接,每次都是 new 了一個 StringBuilder,然后再把 String 轉成 StringBuilder,再進行 append,而頻繁的新建對象不僅要耗費很多時間,還會造成內存資源的浪費。這就從字節碼層面解釋了為什么不建議在循環體內使用 + 去進行字符串的拼接。
接下來再來讓我們看下使用 + 或者 StringBuilder 拼接字符串的原理吧。
使用 + 拼接字符串
在 Java 開發中,最簡單常用的字符串拼接方法就是直接使用 + 來完成:
反編譯后的內容如下:(使用的反編譯工具為 jad)
通過查看反編譯以后的代碼,可以發現,在字符串常量在拼接過程中,是將 String 轉成了 StringBuilder 后,使用其 append() 方法進行處理的。
那么也就是說,Java中的 + 對字符串的拼接,其實現原理是使用 StringBuilder 的 append() 來實現的,使用 + 拼接字符串,其實只是 Java 提供的一個語法糖。
使用 StringBuilder 拼接字符串
StringBuilder 的 append 方法就是第二個常用的字符串拼接姿勢了。
和 String 類類似,StringBuilder 類也封裝了一個字符數組,定義如下:
與 String 不同的是,它并不是 final 的,所以是可以修改的。另外,與 String 不同,字符數組中不一定所有位置都已經被使用,它有一個實例變量,表示數組中已經使用的字符個數,定義如下:
其 append() 方法源碼如下:
該類繼承了 AbstractStringBuilder 類,看下其 append() 方法:
首先判斷拼接的字符串 str 是不是 null,如果是,調用 appendNull() 方法進行處理,appendNull() 方法的源碼如下:
如果字符串 str 不為 null,則判斷拼接后的字符數組長度是否超過當前數組長度,如果超過,則調用 Arrays.copyOf() 方法進行擴容并復制,ensureCapacityInternal() 方法的源碼如下:
最后,將拼接的字符串 str 復制到目標數組 value 中。
總結
本文針對《阿里巴巴Java開發手冊》中的循環體中拼接字符串建議出發,從字節碼層面,來解釋為什么 StringBuilder 比 + 快,還分別介紹了字符串拼接中 + 和 StringBuilder 的原理,因此在循環體拼接字符串時,應該使用 StringBuilder 的 append() 去完成拼接。
總結
以上是生活随笔為你收集整理的android string拼接字符串_为什么阿里巴巴不建议在循环体中使用+进行字符串拼接?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad自动标注界址点_这样绘制cad施工
- 下一篇: python动态显示数据_python中