Java StringBuffer與StringBuider
導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++裏難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看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。
-
java知識點詳細總結大綱
沒有風浪,便沒有勇敢的弄潮兒;沒有荊棘,也沒有不屈的開拓者。以下是小編為大家搜索整理了java知識點詳細總結,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!一:java概述:1991年Sun公司的JamesGosling等人開始開發名稱為Oak的語言,希望用於控制...
-
java考試複習題
人類的希望像是一顆永恆的星,烏雲掩不住它的光芒。特別是在今天,和平不是一個理想,一個夢,它是萬人的願望。以下是小編為大家搜索整理的java考試複習題,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!一、選擇題1、以下程序段執行後的K值為()。...
-
計算機二級JAVA考試強化訓練題(單選)
為幫助考生們更快第掌握二級JAVA相應知識點,以下是本站小編搜索整理的一份計算機二級JAVA考試強化訓練題(單選),供參考練習,預祝考生們考出自己理想的成績!想了解更多相關信息請持續關注我們應屆畢業生考試網!單選題1).下列關於Applet的安全限制的敍述中,錯誤的是(...
-
新手如何學習Java
Java作為一門高級編程語言在信息科技時代有着廣泛的應用。新手如何學習Java呢?下面小編來給大家介紹Java的學習方法,希望對大家有幫助!1理解Java思想Java是一門面向對象編程語言。向對象編程是Java最核心的思想,這也是區分和C等其他編程語言的一個顯著特徵。掌握...
相關文章
- Building Bridges for the Future英語作文
- be grateful for friends的英語作文
- A Lifeguard at Johns Beach Saved a Drowning Child,A Lifeguar英語作文
- Be grateful for friends聖誕節英語作文
- 英語作文Be grateful for friends
- Be grateful for friends為題目的作文
- 劍橋大學University of Cambridge簡介
- Be grateful for friends英語作文
- JAVA編程String和StringBuffer
- java中String和StringBuffer的區別