Strng StringBuffer StringBuilder

先来讲下总的区别:数组

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;
}
相关文章
相关标签/搜索