String、StringBuffer和StringBuilder的区别

String、StringBuffer和StringBuilder的区别

可变性
  • String是不可变的,它使用final关键词修饰--
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
...................
  • StringBuffer和StringBuilder二者都是继承自AbstractStringBuilder,AbstractStringBuilder也是用字符数组保存char value[]当时没有用final修饰,因此这两种对象是可变的
public final class StringBuffer
    extends AbstractStringBuilder

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;
线程安全性
  • String的对象不可变,也就是常量,因此线程安全
  • StringBuffer重写了AbstractStringBuilder的方法,好比append、insert等而且加了同步锁,因此是线程安全的
@Override
    public synchronized int length() {
        return count;
    }

    @Override
    public synchronized int capacity() {
        return value.length;
    }


    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }
  • 而StringBuilder就没加同步锁,因此是非线程安全的
性能

每次修改String的值都会从新生成一个新的String对象,而后再将指针指向新的String对象,StringBuffer和StringBuilder每次都是对象自己进行操做,而不是生成新的对象。StringBuilder的性能会比StringBuffer好一点,不过却要冒多线程不安全的风险java

总结
  • 数据量将多用String
  • 单线程操做大量数据用StringBuilder
  • 多线程操做大量数据用StringBuffer
相关文章
相关标签/搜索