乐趣区

StringStringBuffer和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
退出移动版