1. 程式人生 > >String、StringBuffer和StringBuilder的比較

String、StringBuffer和StringBuilder的比較

一. String
String的值是不可變的,這就導致每次對String的操作都會生成新的String物件,不僅效率低下,而且大量浪費有限的記憶體空間。
String的操作都是改變賦值地址而不是改變值操作。

二.StringBuffer
StringBuffer:字串變數(Synchronized,即執行緒安全)。如果要頻繁對字串內容進行修改,出於效率考慮最好使用StringBuffer,
如果想轉成String型別,可以呼叫StringBuffer的toString()方法

三. StringBuilder
StringBuilder:字串變數(非執行緒安全)。在內部,StringBuilder物件被當作是一個包含字元序列的變長陣列。
但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換

,用在字串緩衝區被單個執行緒使用的時候。

四. 區別 :
String 型別和StringBuffer的主要效能區別:String是不可變的物件, 因此在每次對String 型別進行改變的時候,都會生成一個新的 String 物件,然後將指標指向新的 String 物件,所以經常改變內容的字串最好不要用 String ,因為每次生成物件都會對系統性能產生影響,特別當記憶體中無引用物件多了以後, JVM 的 GC 就會開始工作,效能就會降低。

使用 StringBuffer 類時,每次都會對 StringBuffer 物件本身進行操作,而不是生成新的物件並改變物件引用。所以多數情況下推薦使用 StringBuffer ,特別是字串物件經常改變的情況下。

五. 聯絡
StringBuilder與StringBuffer有公共父類AbstractStringBuilder(抽象類)。
StringBuilder、StringBuffer的方法都會呼叫AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer會在方方法上加synchronized關鍵字,進行同步。

六. 使用
(1)基本原則:如果要操作少量的資料,用String ;單執行緒操作大量資料,用StringBuilder ;多執行緒操作大量資料,用StringBuffer。

(2)不要使用String類的”+”來進行頻繁的拼接,因為那樣會頻繁建立String result儲存結果,效能極差,應該使用StringBuffer或StringBuilder類,這在Java的優化上是一條比較重要的原則。