一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 深入解析Java編程中的StringBuffer與StringBuider

深入解析Java編程中的StringBuffer與StringBuider

2020-01-06 14:30goldensun JAVA教程

這篇文章主要介紹了Java編程中的StringBuffer與StringBuider,是Java入門學習中的基礎知識,需要的朋友可以參考下

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

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

StringBuffer 默認分配16字節長度的緩沖區,當字符串超過該大小時,會自動增加緩沖區長度,而不是生成新的對象。

StringBuffer不像String,只能通過 new 來創建對象,不支持簡寫方式,例如:

?
1
2
3
4
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對象的內容也發生改變,例如:

?
1
2
StringBuffer str = new StringBuffer(“biancheng100”);
str.append(true);


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

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

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

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

deleteCharAt() 方法用來刪除指定位置的字符,并將剩余的字符形成新的字符串。例如:

?
1
2
StringBuffer str = new StringBuffer("abcdef");
str. deleteCharAt(3);


該代碼將會刪除索引值為3的字符,即”d“字符。

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

?
1
2
StringBuffer str = new StringBuffer("abcdef");
str.delete(1, 4);


該代碼會刪除索引值為1~4之間的字符,包括索引值1,但不包括4。
3) insert() 方法

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

?
1
2
StringBuffer str = new StringBuffer("abcdef");
str.insert(3, "xyz");


最后str所指向的字符串為 abcdxyzef。
4) setCharAt() 方法

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

?
1
2
StringBuffer str = new StringBuffer("abcdef");
str.setCharAt(3, 'z');


該代碼將把索引值為3的字符修改為 z,最后str所指向的字符串為 abczef。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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");
  }
}

運行結果:

?
1
2
String: 5287ms
StringBuffer: 3ms

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

?
1
2
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接口的實現過程不一樣,如下圖所示:
深入解析Java編程中的StringBuffer與StringBuider
可見,String直接實現了CharSequence接口;StringBuilder 和 StringBuffer都是可變的字符序列,它們都繼承于AbstractStringBuilder,實現了CharSequence接口。
總結

線程安全:

StringBuffer:線程安全
StringBuilder:線程不安全

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

使用環境:
操作少量的數據使用 String;
單線程操作大量數據使用 StringBuilder;
多線程操作大量數據使用 StringBuffer。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 古装床戏做爰无遮挡三级 | 无码国产成人777爽死在线观看 | 爸爸的宝贝小说全文在线阅读 | 奇米狠狠色 | 精品亚洲一区二区三区在线播放 | 国产在线精品亚洲第一区香蕉 | 草莓绿巨人香蕉茄子芭乐 | 鬼吹灯天星术在线高清观看 | 欧美侏儒xxx | 日本性生活免费看 | 啊啊啊好大在线观看 | 国产日韩视频一区 | free白嫩性hd| 国产精品久久久久久久久免费观看 | 操比视频| 国产在线麻豆波多野结衣 | 国产另类视频一区二区三区 | 欧美日韩精品一区二区三区视频在线 | 双性受合不垅腿攻np | 情缘1完整版在线观看 | 91香蕉视频在线播放 | 午夜在线观看免费完整直播网 | 国产在线精品99一卡2卡 | 特黄特色大片免费视频大全 | 精品福利视频一区二区三区 | 成年人免费在线看 | 欧美男人天堂 | 美女在线看永久免费网址 | 日本精品欧洲www | 人人爱天天做夜夜爽88 | 春色视频网站 | 国产久热精品 | 激情亚洲| 国产成人免费高清激情视频 | 高清黄色直接看 | 国产高清自拍视频 | xxx中国bbbwww | 6个老师的尿奴 | 亚洲一区二区三区在线播放 | 波多野结衣一区免费作品 | 九九九九在线精品免费视频 |