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
相關文章
相關標籤/搜索