先來講下總的區別:數組
1.String 不可變,StringBuffer StringBuilder可變安全
2.StringBuilder,String線程安全,StringBuffer不安全app
而後咱們從源碼來看下緣由(由於博主必需要理解才能記住,否則就是一條魚,尷尬)ide
問題1:爲何String 是不可變的,StringBuffer StringBuilder可變?ui
例子:this
String sb3=new String("ab");
public String(String original) { this.value = original.value; this.hash = original.hash; }
private final char value[];
String對象底層實際上是個數組,並且是final修飾的,下一篇準備整理下final關鍵字線程
StringBuilder sb1=new StringBuilder("ab");
public StringBuilder(String str) { super(str.length() + 16); append(str); }
AbstractStringBuilder(int capacity) { value = new char[capacity]; }
char[] value;
因而可知,StringBuilder對象底層也是數組,可是沒有用final修飾,因此StringBuilder可變.StringBuffer同樣.對象
問題2:StringBuilder,String線程安全,StringBuffer不安全ci
String不可變,線程安全是確定的,主要比較StringBuilder 和StringBuffer源碼
仍是從源碼來看,以append()方法做爲例子:
//StringBuffer的append()方法 @Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
//StringBuilder的方法 @Override public StringBuilder append(CharSequence s) { super.append(s); return this; }