可變性java
簡單來講:String類中使用final關鍵字字符數組保存字符串 private final char value[] 因此String對象是不可變的。數組
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符,可是沒有用final關鍵字修飾,因此這兩種對象都是可變的。安全
StringBuilder 與 StringBuffffer 的構造方法都是調用父類構造方法也就是 AbstractStringBuilder 實現的多線程
abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; AbstractStringBuilder() { } AbstractStringBuilder(int capacity) { value = new char[capacity]; }
線程安全性app
String中的對象是不可變的,也就能夠理解爲常量,是線程安全的。AbstractStringBuilder 是StringBuilder和StringBuffer的公共父類,定義了一些字符串的基本操做,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法或者對調用的方法加了同步鎖,因此是線程安全的。StringBuilder並無對方法加同步鎖,因此是非線程安全的。 性能
性能ui
每次對String類型進行改變時,都會生成一個新的String對象,而後將指針指向新的String對象spa
StringBuffer每次都會對StringBuffer對象自己進行操做,而不是生成新的對象並改變對象引用。相同狀況下使用StringBuilder比StringBuffer僅能得到10%~15%性能的提高,但卻要冒着多線程不安全的風險。線程
對三者使用的總結指針
1.操做少許的數據 = String
2.單線程操做字符串緩衝區下操做大量數據 = StringBuilder
3.多線程操做字符串緩衝區下操做大量數據 = StringBuffer