先来说下总的区别:
1.String 不可变,StringBuffer StringBuilder可变
2.StringBuilder,String线程安全,StringBuffer不安全
然后我们从源码来看下原因(因为博主必须要理解才能记住,不然就是一条鱼,尴尬)
问题1:为什么String 是不可变的,StringBuffer StringBuilder可变?
例子:
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不安全
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; }