網站首頁 語言 會計 網際網路計算機 醫學 學歷 職場 文藝體育 範文
當前位置:學識谷 > 計算機 > java語言

Java StringBuffer與StringBuider

欄目: java語言 / 釋出於: / 人氣:1.2W

導語:Java是一門面向物件程式設計語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看Java StringBuffer與StringBuider,希望對大家有所幫助。

Java StringBuffer與StringBuider

String 的值是不可變的,每次對String的操作都會生成新的String物件,不僅效率低,而且耗費大量記憶體空間。

StringBuffer類和String類一樣,也用來表示字串,但是StringBuffer的內部實現方式和String不同,在進行字串處理時,不生成新的物件,在記憶體使用上要優於String。

StringBuffer 預設分配16位元組長度的緩衝區,當字串超過該大小時,會自動增加緩衝區長度,而不是生成新的物件。

StringBuffer不像String,只能通過 new 來建立物件,不支援簡寫方式,例如:

1

StringBuffer str1 = new StringBuffer(); // 分配16個位元組長度的緩衝區

StringBuffer str2 = =new StringBuffer(512); // 分配512個位元組長度的緩衝區

// 在緩衝區中存放了字串,並在後面預留了16個位元組長度的空緩衝區

StringBuffer str3 = new StringBuffer("");

StringBuffer類的主要方法

StringBuffer類中的方法主要偏重於對於字串的操作,例如追加、插入和刪除等,這個也是StringBuffer類和String類的`主要區別。實際開發中,如果需要對一個字串進行頻繁的修改,建議使用 StringBuffer。

  1) append() 方法

append() 方法用於向當前字串的末尾追加內容,類似於字串的連線。呼叫該方法以後,StringBuffer物件的內容也發生改變,例如:

1

StringBuffer str = new StringBuffer(“biancheng100”);

nd(true);

則物件str的值將變成”biancheng100true”。注意是str指向的內容變了,不是str的指向變了。

字串的”+“操作實際上也是先建立一個StringBuffer物件,然後呼叫append()方法將字串片段拼接起來,最後呼叫toString()方法轉換為字串。

這樣看來,String的連線操作就比StringBuffer多出了一些附加操作,效率上必然會打折扣。

但是,對於長度較小的字串,”+“操作更加直觀,更具可讀性,有些時候可以稍微犧牲一下效率。

  2) CharAt()

CharAt() 方法用來刪除指定位置的字元,並將剩餘的字元形成新的字串。例如:

1

StringBuffer str = new StringBuffer("abcdef");

str. CharAt(3);

該程式碼將會刪除索引值為3的字元,即”d“字元。

你也可以通過()方法一次性刪除多個字元,例如:

1

StringBuffer str = new StringBuffer("abcdef");

str.(1, 4);

該程式碼會刪除索引值為1~4之間的字元,包括索引值1,但不包括4。

  3) () 方法

() 用來在指定位置插入字串,可以認為是append()的升級版。例如:

1

StringBuffer str = new StringBuffer("abcdef");

str.(3, "xyz");

最後str所指向的字串為 abcdxyzef。

  4)setCharAt() 方法

setCharAt() 方法用來修改指定位置的字元。例如:

1

StringBuffer str = new StringBuffer("abcdef");

harAt(3, 'z');

該程式碼將把索引值為3的字元修改為 z,最後str所指向的字串為 abczef。

以上僅僅是部分常用方法的簡單說明,更多方法和解釋請查閱API文件。

String和StringBuffer的效率對比

為了更加明顯地看出它們的執行效率,下面的程式碼,將26個英文字母加了10000次。

1

public class Demo {

public static void main(String[] args){

String fragment = "abcdefghijklmnopqrstuvwxyz";

int times = 10000;

// 通過String物件

long timeStart1 = entTimeMillis();

String str1 = "";

for (int i=0; i str1 += fragment;

}

long timeEnd1 = entTimeMillis();

tln("String: " + (timeEnd1 - timeStart1) + "ms");

// 通過StringBuffer

long timeStart2 = entTimeMillis();

StringBuffer str2 = new StringBuffer();

for (int i=0; i nd(fragment);

}

long timeEnd2 = entTimeMillis();

tln("StringBuffer: " + (timeEnd2 - timeStart2) + "ms");

}

}

  執行結果:

String: 5287ms

StringBuffer: 3ms

結論很明顯,StringBuffer的執行效率比String快上千倍,這個差異隨著疊加次數的增加越來越明顯,當疊加次數達到30000次的時候,執行結果為:

String: 35923ms

StringBuffer: 8ms

所以,強烈建議在涉及大量字串操作時使用StringBuffer。

StringBuilder類

StringBuilder類和StringBuffer類功能基本相似,方法也差不多,主要區別在於StringBuffer類的方法是多執行緒安全的,而StringBuilder不是執行緒安全的,相比而言,StringBuilder類會略微快一點。

StringBuffer、StringBuilder、String中都實現了CharSequence介面。

CharSequence是一個定義字串操作的介面,它只包括length()、charAt(int index)、subSequence(int start, int end) 這幾個API。

StringBuffer、StringBuilder、String對CharSequence介面的實現過程不一樣,如下圖所示:

圖1 對CharSequence介面的實現

可見,String直接實現了CharSequence介面;StringBuilder 和 StringBuffer都是可變的字元序列,它們都繼承於AbstractStringBuilder,實現了CharSequence介面。

  總結

執行緒安全:

StringBuffer:執行緒安全StringBuilder:執行緒不安全

速度:

一般情況下,速度從快到慢為 StringBuilder > StringBuffer > String,當然這是相對的,不是絕對的。

使用環境:

操作少量的資料使用 String;單執行緒操作大量資料使用 StringBuilder;多執行緒操作大量資料使用 StringBuffer。