String StringBuffer和StringBuilder

String StringBuffer和StringBuilder

     首先這三者都是用來存儲字符串的。

      String、StringBuffer、StringBuilder都是被final修飾的,是不能夠被繼承改寫的。

     String存儲的字符串常量,存儲在字符串常量區(方法區中的一塊地方)。所謂常量,即不可以改變的類型。
當我們定義一個String str1="aaa" ,這時就會在字符串常量區生成一個新的字符串對象“aaa”,str1則指向“aaa”,str1是“aaa”的一個引用。
再定義一個String str2=“bbb”。
         當我們執行拼接字符串操作時,比如String str3=str1+str2時,就會在字符串常量區生產一個新的對象“aaabbb”,str3則指向這個新的字符串。

        這種方式的弊端是會生成很多無用的字符串,比如“aaa”,"bbb"在生成str3之後可能就不使用了,但是他們還佔據着常量區的空間。



        StringBuffer是可拼接的字符串,在原來的字符串上可以實現添加(append)和刪除(delete)操作。這種形式的字符串不會像String那樣需要生成每一個對象再實現拼接,自始自終就只有一個對象,因此就比較節約空間。

StringBuffer是線程安全的字符串,主要方法上都加了synchronized同步。

@Override
    public synchronized int length() {
        return count;
    }

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


    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }

    /**
     * @since      1.5
     */
    @Override
    public synchronized void trimToSize() {
        super.trimToSize();
    }

    /**
     * @throws IndexOutOfBoundsException {@inheritDoc}
     * @see        #length()
     */
    @Override
    public synchronized void setLength(int newLength) {
        toStringCache = null;
        super.setLength(newLength);
    }

而StringBuilder和StringBuffer的主要區別就是StringBuilder是沒有加synchronize同步的,速度比StringBuffer快。

缺點就是 StringBuilder不是線程安全的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章