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的優化上是一條比較重要的原則。
|