天天看點

StringBuffer不像String隻能通過new來建立對象

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

StringBuffer類和String類一樣,也用來表示字元串,但是StringBuffer的内部實作方式和String不同,在進行字元串處理時,不生成新的對象,在記憶體使用上要優于String。

StringBuffer 預設配置設定16位元組長度的緩沖區,當字元串超過該大小時,會自動增加緩沖區長度,而不是生成新的對象。

StringBuffer不像String,隻能通過 new 來建立對象,不支援簡寫方式,例如:

StringBuffer str1 = new StringBuffer(); // 配置設定16個位元組長度的緩沖區

StringBuffer str2 = =new StringBuffer(512); // 配置設定512個位元組長度的緩沖區

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

StringBuffer str3 = new StringBuffer(“www.weixueyuan.net”);

StringBuffer類的主要方法

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

  1. append() 方法

    append() 方法用于向目前字元串的末尾追加内容,類似于字元串的連接配接。調用該方法以後,StringBuffer對象的内容也發生改變,例如:

    StringBuffer str = new StringBuffer(“biancheng100”);

    str.append(true);

    則對象str的值将變成”biancheng100true”。注意是str指向的内容變了,不是str的指向變了。

字元串的”+“操作實際上也是先建立一個StringBuffer對象,然後調用append()方法将字元串片段拼接起來,最後調用toString()方法轉換為字元串。

https://math.stackexchange.com/users/952897/

https://math.stackexchange.com/users/952898/

https://math.stackexchange.com/users/952899/

https://math.stackexchange.com/users/952894/

https://math.stackexchange.com/users/952895/

https://math.stackexchange.com/users/952896/

https://math.stackexchange.com/users/952903/

https://math.stackexchange.com/users/952904/

https://math.stackexchange.com/users/952902/

https://math.stackexchange.com/users/952900/

https://math.stackexchange.com/users/952901/

https://math.stackexchange.com/users/952893/

https://math.stackexchange.com/users/952867/

https://math.stackexchange.com/users/952868/

https://math.stackexchange.com/users/952865/

https://math.stackexchange.com/users/952866/

https://math.stackexchange.com/users/952870/

https://math.stackexchange.com/users/952873/

https://math.stackexchange.com/users/952874/

https://math.stackexchange.com/users/952871/

https://math.stackexchange.com/users/952872/

https://math.stackexchange.com/users/952858/

https://math.stackexchange.com/users/952859/

https://math.stackexchange.com/users/952856/

https://math.stackexchange.com/users/952857/

https://math.stackexchange.com/users/952860/

https://math.stackexchange.com/users/952863/

https://math.stackexchange.com/users/952864/

https://math.stackexchange.com/users/952861/

https://math.stackexchange.com/users/952862/

https://math.stackexchange.com/users/952875/

https://math.stackexchange.com/users/952887/

https://math.stackexchange.com/users/952888/

https://math.stackexchange.com/users/952885/

https://math.stackexchange.com/users/952886/

https://math.stackexchange.com/users/952889/

https://math.stackexchange.com/users/952892/

https://math.stackexchange.com/users/952805/

https://math.stackexchange.com/users/952890/

https://math.stackexchange.com/users/952891/

https://math.stackexchange.com/users/952878/

https://math.stackexchange.com/users/952879/

https://math.stackexchange.com/users/952876/

https://math.stackexchange.com/users/952877/

https://math.stackexchange.com/users/952880/

https://math.stackexchange.com/users/952883/

https://math.stackexchange.com/users/952884/

https://math.stackexchange.com/users/952881/

https://math.stackexchange.com/users/952882/

https://math.stackexchange.com/users/952854/

https://stackoverflow.com/users/16651193/

https://stackoverflow.com/users/16651885/

https://stackoverflow.com/users/16651896/

https://stackoverflow.com/users/16651912/

https://stackoverflow.com/users/16651918/

https://stackoverflow.com/users/16651923/

https://stackoverflow.com/users/16651929/

https://stackoverflow.com/users/16651945/

https://stackoverflow.com/users/16651951/

https://stackoverflow.com/users/16651953/

https://stackoverflow.com/users/16651969/

https://stackoverflow.com/users/16651982/

https://stackoverflow.com/users/16651984/

https://stackoverflow.com/users/16651991/

https://stackoverflow.com/users/16651994/

https://stackoverflow.com/users/16651998/

https://stackoverflow.com/users/16652005/

https://stackoverflow.com/users/16652006/

https://stackoverflow.com/users/16652008/

https://stackoverflow.com/users/16652010/

https://stackoverflow.com/users/16652014/

https://stackoverflow.com/users/16652016/

https://stackoverflow.com/users/16652019/

https://stackoverflow.com/users/16652026/

https://stackoverflow.com/users/16652032/

https://stackoverflow.com/users/16652036/

https://stackoverflow.com/users/16652041/

https://stackoverflow.com/users/16652046/

https://stackoverflow.com/users/16652049/

https://stackoverflow.com/users/16652052/

https://stackoverflow.com/users/16652053/

https://stackoverflow.com/users/16652056/

https://stackoverflow.com/users/16652061/

https://stackoverflow.com/users/16652065/

https://stackoverflow.com/users/16652068/

https://stackoverflow.com/users/16652071/

https://stackoverflow.com/users/16652073/

https://stackoverflow.com/users/16652076/

https://stackoverflow.com/users/16652078/

https://stackoverflow.com/users/16652085/

https://stackoverflow.com/users/16652092/

https://stackoverflow.com/users/16652096/

https://stackoverflow.com/users/16652100/

https://stackoverflow.com/users/16652102/

https://stackoverflow.com/users/16652106/

https://stackoverflow.com/users/16652110/

https://stackoverflow.com/users/16652111/

https://stackoverflow.com/users/16652116/

https://stackoverflow.com/users/16652119/

https://stackoverflow.com/users/16652124/

https://superuser.com/users/1487339/

https://superuser.com/users/1487342/

https://superuser.com/users/1487346/

https://superuser.com/users/1487348/

https://superuser.com/users/1487349/

https://superuser.com/users/1487350/

https://superuser.com/users/1487351/

https://superuser.com/users/1487352/

https://superuser.com/users/1487353/

https://superuser.com/users/1487355/

https://superuser.com/users/1487356/

https://superuser.com/users/1487357/

https://superuser.com/users/1487358/

https://superuser.com/users/1487360/

https://superuser.com/users/1487361/

https://superuser.com/users/1487362/

https://superuser.com/users/1487363/

https://superuser.com/users/1487365/

https://superuser.com/users/1487366/

https://superuser.com/users/1487367/

https://superuser.com/users/1487369/

https://superuser.com/users/1487371/

https://superuser.com/users/1487372/

https://superuser.com/users/1487373/

https://superuser.com/users/1487374/

https://superuser.com/users/1487375/

https://superuser.com/users/1487377/

https://superuser.com/users/1487378/

https://superuser.com/users/1487379/

https://superuser.com/users/1487381/

https://superuser.com/users/1487382/

https://superuser.com/users/1487383/

https://superuser.com/users/1487384/

https://superuser.com/users/1487385/

https://superuser.com/users/1487387/

https://superuser.com/users/1487388/

https://superuser.com/users/1487389/

https://superuser.com/users/1487390/

https://superuser.com/users/1487391/

https://superuser.com/users/1487392/

https://superuser.com/users/1487393/

https://superuser.com/users/1487395/

https://superuser.com/users/1487396/

https://superuser.com/users/1487397/

https://superuser.com/users/1487398/

https://superuser.com/users/1487400/

https://superuser.com/users/1487401/

https://superuser.com/users/1487402/

https://superuser.com/users/1487403/

https://superuser.com/users/1487404/

https://serverfault.com/users/796702/

https://serverfault.com/users/796704/

https://serverfault.com/users/796705/

https://serverfault.com/users/796709/

https://serverfault.com/users/796710/

https://serverfault.com/users/796711/

https://serverfault.com/users/796712/

https://serverfault.com/users/796713/

https://serverfault.com/users/796714/

https://serverfault.com/users/796715/

https://serverfault.com/users/796716/

https://serverfault.com/users/796717/

https://serverfault.com/users/796718/

https://serverfault.com/users/796719/

https://serverfault.com/users/796721/

https://serverfault.com/users/796722/

https://serverfault.com/users/796724/

https://serverfault.com/users/796725/

https://serverfault.com/users/796726/

https://serverfault.com/users/796728/

https://serverfault.com/users/796729/

https://serverfault.com/users/796730/

https://serverfault.com/users/796732/

https://serverfault.com/users/796733/

https://serverfault.com/users/796734/

https://serverfault.com/users/796735/

https://serverfault.com/users/796736/

https://serverfault.com/users/796737/

https://serverfault.com/users/796738/

https://serverfault.com/users/796739/

https://serverfault.com/users/796740/

https://serverfault.com/users/796741/

https://serverfault.com/users/796742/

https://serverfault.com/users/796744/

https://serverfault.com/users/796745/

https://serverfault.com/users/796746/

https://serverfault.com/users/796748/

https://serverfault.com/users/796749/

https://serverfault.com/users/796750/

https://serverfault.com/users/796751/

https://serverfault.com/users/796752/

https://serverfault.com/users/796753/

https://serverfault.com/users/796754/

https://serverfault.com/users/796756/

https://serverfault.com/users/796757/

https://serverfault.com/users/796758/

https://serverfault.com/users/796759/

https://serverfault.com/users/796760/

https://serverfault.com/users/796762/

https://serverfault.com/users/796763/

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

2) deleteCharAt()

deleteCharAt() 方法用來删除指定位置的字元,并将剩餘的字元形成新的字元串。例如:

StringBuffer str = new StringBuffer(“abcdef”);

str. deleteCharAt(3);

該代碼将會删除索引值為3的字元,即”d“字元。

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

StringBuffer str = new StringBuffer(“abcdef”);

str.delete(1, 4);

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

3) insert() 方法

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

StringBuffer str = new StringBuffer(“abcdef”);

str.insert(3, “xyz”);

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

4) setCharAt() 方法

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

StringBuffer str = new StringBuffer(“abcdef”);

str.setCharAt(3, ‘z’);

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

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

String和StringBuffer的效率對比

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

public class Demo {

public static void main(String[] args){

String fragment = “abcdefghijklmnopqrstuvwxyz”;

int times = 10000;

// 通過String對象
    long timeStart1 = System.currentTimeMillis();
    String str1 = "";
    for (int i=0; i<times; i++) {
        str1 += fragment;
    }
    long timeEnd1 = System.currentTimeMillis();
    System.out.println("String: " + (timeEnd1 - timeStart1) + "ms");
   
    // 通過StringBuffer
    long timeStart2 = System.currentTimeMillis();
    StringBuffer str2 = new StringBuffer();
    for (int i=0; i<times; i++) {
        str2.append(fragment);
    }
    long timeEnd2 = System.currentTimeMillis();
    System.out.println("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接口的實作過程不一樣,如下圖所示:

StringBuffer不像String隻能通過new來建立對象

圖1 對CharSequence接口的實作

可見,String直接實作了CharSequence接口;StringBuilder 和 StringBuffer都是可變的字元序列,它們都繼承于AbstractStringBuilder,實作了CharSequence接口。

總結

線程安全:

StringBuffer:線程安全

StringBuilder:線程不安全

速度:

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

使用環境:

操作少量的資料使用 String;

單線程操作大量資料使用 StringBuilder;

多線程操作大量資料使用 StringBuffer。

繼續閱讀