先来讲下总的区别:数组
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; }