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。
-
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接口的實作過程不一樣,如下圖所示:
圖1 對CharSequence接口的實作
可見,String直接實作了CharSequence接口;StringBuilder 和 StringBuffer都是可變的字元序列,它們都繼承于AbstractStringBuilder,實作了CharSequence接口。
總結
線程安全:
StringBuffer:線程安全
StringBuilder:線程不安全
速度:
一般情況下,速度從快到慢為 StringBuilder > StringBuffer > String,當然這是相對的,不是絕對的。
使用環境:
操作少量的資料使用 String;
單線程操作大量資料使用 StringBuilder;
多線程操作大量資料使用 StringBuffer。