程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻解析Java編程中的StringBuffer與StringBuider

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

編輯:關於JAVA

深刻解析Java編程中的StringBuffer與StringBuider。本站提示廣大學習愛好者:(深刻解析Java編程中的StringBuffer與StringBuider)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java編程中的StringBuffer與StringBuider正文


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()辦法轉換為字符串。

如許看來,String的銜接操作就比StringBuffer多出了一些附加操作,效力上必定會打扣頭。

然則,關於長度較小的字符串,”+“操作加倍直不雅,更具可讀性,有些時刻可以略微就義一下效力。
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接口的完成進程紛歧樣,以下圖所示:

可見,String直接完成了CharSequence接口;StringBuilder 和 StringBuffer都是可變的字符序列,它們都繼續於AbstractStringBuilder,完成了CharSequence接口。
總結

線程平安:

StringBuffer:線程平安
StringBuilder:線程不平安

速度:
普通情形下,速度從快到慢為 StringBuilder > StringBuffer > String,固然這是絕對的,不是相對的。

應用情況:
操作大批的數據應用 String;
單線程操作年夜量數據應用 StringBuilder;
多線程操作年夜量數據應用 StringBuffer。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved