Java面試——String、StringBuider以及StringBuffer的區別和使用場景

1. 為什麼我們需要StringBuffer類和StringBuilder類
String是不可變的物件,因此在每次對String型別進行改變的時候,都會生成一個新的String物件,然後將指標指向新的String物件,所以經常改變內容的字串最好不要用String,因為每次生成物件會降低效能,當記憶體中無引用物件多了GC就會開始工作,效能就會降低。
不要使用String類的"+"來進行頻繁的拼接,因為效能是極差的,應該使用StringBuffer或StringBuilder類。
如下的例子,就該使用第二種方案。

2. StringBuider和StringBuffer的區別
StringBuilder與StringBuffer有公共父類AbstractStringBuilder(抽象類)。
StringBuffer對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的。
StringBuilder並沒有對方法進行加同步鎖,所以是非執行緒安全的。
給大家推薦一個程式員學習交流群:702895049 群裡有分享的視訊,還有思維導圖
群公告有視訊,都是乾貨的,你可以下載來看。主要分享分散式架構、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰學習架構師視訊。
3. StringBuider和StringBuffer的使用場景
當單執行緒操作大量資料時,建議使用StringBuilder,速度更快(10%~15%左右的效能提升),畢竟同步有效能開銷。
多執行緒操作大量資料時,建議使用StringBuffer。可用於全域性變數中。
相同情況下StirngBuilder雖然比StringBuffer獲得10%~15%左右的效能提升,但卻要冒多執行緒不安全的風險。而在現實的模組化程式設計中,負責某一模組的程式設計師不一定能清晰地判斷該模組是否會放入多執行緒的環境中執行,因此除非確定系統的瓶頸是在StringBuffer上,並且確定你的模組不會執行在多執行緒模式下,才可以採用StringBuilder,否則還是用StringBuffer。
4. StringBuider和StringBuffer的實現原理
我們知道使用StringBuffer和StringBuider無非就是為了提高字串連線的效率,因為直接使用+進行字串連線會建立多個String物件,造成一定的開銷。
AbstractStringBuilder中採用一個char陣列來儲存字串,char陣列有一個初始大小(16),當append的字串長度超過當前char陣列容量時,則對char陣列進行動態擴容,然後將當前char陣列拷貝到新的位置,因為重新分配記憶體並拷貝的開銷比較大,所以每次都是進行固定擴容2倍的方式(使用JNI方法System.arraycopy())。
最後就是,為了獲得更好的效能,在構造StirngBuffer或StirngBuilder時應儘可能指定它們的容量。當然,如果你操作的字串長度(length)不超過16個字元就不用了,因為預設容量為16。不指定容量會顯著降低效能。

