Java學習筆記4——StringBuffer和StringBuilder

一、StringBuffer
StringBuffer是final修飾的類,但它存放的內容是可以改變的。
StringBuffer是線程安全的。

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{
...
}

1、構造方法:
(1)默認的無參構造方法:public StringBuffer()
創建一個StringBuffer對象,默認大小爲16。

StringBuffer sb = new StringBuffer();
//構造方法
public StringBuffer() {
    super(16);
}

(2)以容量大小(整型)爲參數的構造方法:public StringBuffer(int capacity)
創建指定大小的StringBuffer對象。

StringBuffer sb = new StringBuffer(100);
public StringBuffer(int capacity) {
    super(capacity);
}

(3)以字符串爲參數的構造方法:public StringBuffer(String str)
創建一個存在指定字符串的StringBuffer對象。

StringBuffer sb = new StringBuffer("Hello world!");
public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}

(4)以CharSequence爲參數的構造函數:public StringBuffer(CharSequence seq)
創建一個存在指定字符序列的StringBuffer對象。

CharSequence c = "Hello world!";
StringBuffer sb = new StringBuffer(c);

此方法是調用了(2)的構造方法。

public StringBuffer(CharSequence seq) {
    this(seq.length() + 16);
    append(seq);
}

簡單說一下,CharSequence與String都能用於定義字符串,但CharSequence的值是可讀可寫序列,而String的值是隻讀序列。

//父類的構造方法
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}

因爲StringBuffer繼承了AbstractStringBuffer,其構造方法均是直接或間接調用父類的構造方法。


2、成員方法
A、StringBuffer支持的方法
(1)將指定的字符串追加到此字符序列:public synchronized StringBuffer append(String str)
(2)將此字符序列用其反轉形式取代:public StringBuffer reverse()
(3)移除此序列的子字符串中的字符:public delete(int start, int end)
(4)將 int 參數的字符串表示形式插入此序列中:public insert(int offset, int i)
(5)使用給定 String 中的字符替換此序列的子字符串中的字符replace(int start, int end, String str)

例子:

public class StringDemo {  
    public static void main(String[] args) {  
        String s1 = "world";
        StringBuffer sb = new StringBuffer();

        sb.append("Hello");
        sb.append(s1);
        System.out.println(sb.toString());
        System.out.println("-------------------");

        sb.reverse();
        System.out.println(sb.toString());
        System.out.println("-------------------");

    sb.insert(5," ");
        System.out.println(sb.toString());
        System.out.println("-------------------");

        sb.delete(1, 3);
        System.out.println(sb.toString());
        System.out.println("-------------------");

        sb.replace(1, 3, "666");
        System.out.println(sb.toString());
        System.out.println("-------------------");

    }  
}

B、與String類似的方法
(1)獲取StringBuffer字符的長度:public synchronized int length()
(2)獲取當前容量:public synchronized int capacity()
(3)確保容量至少等於指定的最小值:public synchronized void ensureCapacity(int minimumCapacity)
(4)調整當前容量大小:public synchronized void setLength(int newLength)
(5)獲取此序列中指定位置處的 char 值:public synchronized char charAt(int index)
包括了String類的很多方法,在StringBuffer中也可以使用。此處不再舉例表述。

因爲StringBuffer中的方法幾乎都是被synchronized修飾,所以StringBuffer可以保證線程安全。

二、StringBuilder
StringBuilder 類是在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。其他成員方法等等都是類似的。

由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder類。然而在應用程序要求線程安全的情況下,則必須使用StringBuffer類。

三、String、StringBuffer、StringBuilder的區別
String屬於字符串常量,StringBuffer和StringBuilder屬於字符串變量。
String在修改時,是重新創建了一個String對象,然後再把引用指向新的對象。
而StringBuffer和StringBuilder都是在原對象上進行字符串拼接操作。一般情況下推薦使用StringBuilder。
從執行速度方面來說,StringBuilder>StringBuffer>String
在大部分情況下 StringBuilder > StringBuffer> String,當涉及多線程的情況時,則選用StringBuffer。

StringBuilder速度快,但是線程不安全。
StringBuffer速度慢,但是線程安全。


回顧了一下StringBuffer和StringBuilder,大致對這兩個類有了一定的瞭解。

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