String、StringBuffer、StringBuilder對比,stringbuffer
1、String
用於存放字元的數組被聲明為final的,因此只能賦值一次,不可再更改。這就導致每次對String的操作都會產生新的String對象,不僅效率低下,而且大量浪費有限的記憶體空間。
String a ="a"; //假設a指向地址0x0001
a ="b";//重新賦值後a指向地址0x0002,但0x0001地址中儲存的"a"依舊存在,但已經不再是a所指向的,a 已經指向了其它地址。
因此String的操作都是改變賦值地址而不是改變值操作。對String對象的任何改變都不影響到原對象,相關的任何change操作都會產生新的對象
2、StringBuffer
StringBuffer是一個從JDK1.0開始就存在的類,它就像String類一樣,不過其內部成員是可以修改的。
StringBuffer是可變類,和安全執行緒的字串操作類,任何對它指向的字串的操作都不會產生新的對象。每個StringBuffer對象都有一定的緩衝區容量,當字串大小沒有超過容量時,不會分配新的容量,當字串大小超過容量時,會自動增加容量。
StringBuffer 上的主要操作是append 和 insert 方法,可重載這些方法,以接受任意類型的資料。每個方法都能有效地將給定的資料轉換成字串,然後將該字串的字元追加或插入到字串緩衝區中。append 方法始終將這些字元添加到緩衝區的末端;而 insert 方法則在指定的點添加字元。例如,如果 z 引用一個當前內容是“start”的字串緩衝區對象,則此方法調用 z.append("le") 會使字串緩衝區包含“startle”,而z.insert(4, "le") 將更改字串緩衝區,使之包含“starlet”。
3、StringBuilder
StringBuilder是一個可變的字元序列,是JDK5.0新增的。此類提供一個與StringBuffer 相容的 API,但不保證同步。該類被設計用作StringBuffer 的一個簡易替換,用在字串緩衝區被單個線程使用的時候(這種情況很普遍)。
它和StringBuffer提供相同的介面。
相同點:它們繼承相同的父類:Abstract StringBuilder
它們實現相同的介面:java.io.Serializable, CharSequence
它們基本上對外提供相同的方法
不同點:StringBuffer類是安全執行緒的,所有StringBuffer提供的public方法基本上都是synchronized。StringBuilder類不是安全執行緒的,它的方法沒有被synchronized鎖修飾。相比而言,StringBuilder類會略微快一點
4、總結
如果要操作少量的資料用 String
單線程操作字串緩衝區下操作大量資料用StringBuilder
多線程操作字串緩衝區下操作大量資料用StringBuffer
如果一個字串變數是在方法裡面定義的,這種情況可能只有一個線程訪問它,不存在不安全的因素,則用StringBuilder,如果要在類裡面定義成員變數,並且這個類的執行個體對象會在多線程環境下使用那麼最好使用StringBuffer。
String是不可變的對象, 因此在每次對String 類型進行改變的時候,都會產生一個新的 String 對象,然後將指標指向新的 String 對象,所以經常改變內容的字串最好不要用 String ,因為每次產生對象都會對系統效能產生影響,特別當記憶體中無引用對象多了以後, JVM 的 GC 就會開始工作,效能就會降低。
不要使用String類的"+"來進行頻繁的拼接,因為那樣的效能極差的,應該使用StringBuffer或StringBuilder類,這在Java的最佳化上是一條比較重要的原則。