Java-String versus StringBuffer versus StringBuilder

Java-String versus StringBuffer versus StringBuilder

這篇介紹String versus StringBuffer versus StringBuilder個別的差異以及效能上的議題。

String

1
2
String的值是不可變的(immutable),這造成每次對String的操作都會生成新的String物件,不僅效率低下,而且大量浪費有限的記憶體空間。
String的操作都是call by reference而不是call by value

StringBuffer

1
2
StringBuffer:Synchronized、thread-safe。若需要經常對字串內容進行修改,使用StringBuffer的效率最好,
如果想轉成String型別,可以呼叫StringBuffer的toString()方法。

StringBuilder

1
2
StringBuilder:non-thread-safe。StringBuilder物件被當作是一個包含字元序列的變長陣列。
但不保證同步。該class被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候。

String和StringBuffer區別

1
2
3
4
5
需經常改變內容的字串不建議使用String,因為每次生成物件都會對系統性能產生影響,特別當記憶體中無引用物件多了以後,
JVM 的 GC 就會開始工作,效能就會降低。

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

StringBuilder versus StringBuffer

1
2
StringBuilder與StringBuffer有public parent class - AbstractStringBuilder。
StringBuilder、StringBuffer的方法都會呼叫AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer會在方方法上加synchronized關鍵字,進行同步。

使用建議

1
2
3
4
5
6
7
1.基本原則:
如果要操作少量的資料,用String
單執行緒操作大量資料,用StringBuilder
多執行緒操作大量資料,用StringBuffer

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