转载

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好一点,不过却要冒多线程不安全的风险

总结

  • 数据量将多用String
  • 单线程操作大量数据用StringBuilder
  • 多线程操作大量数据用StringBuffer
原文  https://segmentfault.com/a/1190000021068489
正文到此结束
Loading...