java String,StringBuffer,StringBuilder的區別

來源:互聯網
上載者:User

標籤:

StringBuilder、StringBuffer的方法都會調用AbstractStringBuilder中的公用方法,如super.append(...)。只是StringBuffer會在方法上加synchronized關鍵字,進行同步。 最後,如果程式不是多線程的,那麼使用StringBuilder效率高於StringBuffer ? 這句話並不理解。1 String

String:字串常量,字串長度不可變。Java中String是immutable(不可變)的。

String類的包含如下定義:

[java] view plaincopy
  1. /** The value is used for character storage. */  
  2. private final char value[];  
  3.   
  4. /** The offset is the first index of the storage that is used. */  
  5. private final int offset;  
  6.   
  7. /** The count is the number of characters in the String. */  
  8. private final int count;  

用於存放字元的數組被聲明為final的,因此只能賦值一次,不可再更改。

2 StringBuffer(JDK1.0)

StringBuffer:字串變數(Synchronized,即安全執行緒)。如果要頻繁對字串內容進行修改,出於效率考慮最好使用StringBuffer,如果想轉成String類型,可以調用StringBuffer的toString()方法。

Java.lang.StringBuffer安全執行緒的可變字元序列。在任意時間點上它都包含某種特定的字元序列,但通過某些方法調用可以改變該序列的長度和內容。可將字串緩衝區安全地用於多個線程。

StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的資料。每個方法都能有效地將給定的資料轉換成字串,然後將該字串的字元追加或插入到字串緩衝區中。 append 方法始終將這些字元添加到緩衝區的末端;而 insert 方法則在指定的點添加字元。例如,如果 z 引用一個當前內容是“start”的字串緩衝區對象,則此方法調用 z.append("le") 會使字串緩衝區包含“startle”,而 z.insert(4, "le") 將更改字串緩衝區,使之包含“starlet”。

3 StringBuilder(JDK5.0)

StringBuilder:字串變數(非安全執行緒)。在內部,StringBuilder對象被當作是一個包含字元序列的變長數組。

java.lang.StringBuilder是一個可變的字元序列,是 JDK5.0新增的。此類提供一個與 StringBuffer 相容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個線程使用的時候(這種情況很普遍)。

其構造方法如下:

構造方法 描述
StringBuilder() 建立一個容量為16的StringBuilder對象(16個空元素)
StringBuilder(CharSequence cs) 建立一個包含cs的StringBuilder對象,末尾附加16個空元素
StringBuilder(int initCapacity) 建立一個容量為initCapacity的StringBuilder對象
StringBuilder(String s) 建立一個包含s的StringBuilder對象,末尾附加16個空元素

在大部分情況下,StringBuilder > StringBuffer。這主要是由於前者不需要考慮安全執行緒。

4 三者區別

String 類型和StringBuffer的主要效能區別:String是不可變的對象, 因此在每次對String 類型進 行改變的時候,都會產生一個新的 String 對象,然後將指標指向新的 String 對象,所以經常改變內容的字串最好不要用 String ,因為每次產生對象都會對系統效能產生影響,特別當記憶體中無引用對象多了以後, JVM 的 GC 就會開始工作,效能就會降低。

使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是產生新的對象並改變對象引用。所以多數情況下推薦使用 StringBuffer ,特別是字串對象經常改變的情況下。

在某些特別情況下, String 對象的字串拼接其實是被 Java Compiler 編譯成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,例如:

[java] view plaincopy
  1. String s1 = “This is only a” + “ simple” + “ test”;  
  2. StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);  

產生 String s1對象的速度並不比 StringBuffer慢。其實在Java Compiler裡,自動做了如下轉換:
Java Compiler直接把上述第一條語句編譯為:

[java] view plaincopy
  1. String s1 = “This is only a simple test”;  

所以速度很快。但要注意的是,如果拼接的字串來自另外的String對象的話,Java Compiler就不會自動轉換了,速度也就沒那麼快了,例如:

[java] view plaincopy
  1. String s2 = “This is only a”;  
  2. String s3 = “ simple”;  
  3. String s4 = “ test”;  
  4. String s1 = s2 + s3 + s4;  

這時候,Java Compiler會規規矩矩的按照原來的方式去做,String的concatenation(即+)操作利用了StringBuilder(或StringBuffer)的append方法實現,此時,對於上述情況,若s2,s3,s4採用String定義,拼接時需要額外建立一個StringBuffer(或StringBuilder),之後將StringBuffer轉換為String;若採用StringBuffer(或StringBuilder),則不需額外建立StringBuffer。

5 使用原則

(1)基本原則:如果要操作少量的資料,用String ;單線程操作大量資料,用StringBuilder ;多線程操作大量資料,用StringBuffer。

(2)不要使用String類的"+"來進行頻繁的拼接,因為那樣的效能極差的,應該使用StringBuffer或StringBuilder類,這在Java的最佳化上是一條比較重要的原則。例如:

[java] view plaincopy
  1. String result = "";  
  2. for (String s : hugeArray) {  
  3.     result = result + s;  
  4. }  
  5.   
  6. // 使用StringBuilder  
  7. StringBuilder sb = new StringBuilder();  
  8. for (String s : hugeArray) {  
  9.     sb.append(s);  
  10. }  
  11. String result = sb.toString();  

當出現上面的情況時,顯然我們要採用第二種方法,因為第一種方法,每次迴圈都會建立一個String result用於儲存結果,除此之外二者基本相同(對於jdk1.5及之後版本)

(3)為了獲得更好的效能,在構造 StirngBuffer 或 StirngBuilder 時應儘可能指定它們的容量。當然,如果你操作的字串長度(length)不超過 16 個字元就不用了,當不指定容量(capacity)時預設構造一個容量為16的對象。不指定容量會顯著降低效能。

(4)StringBuilder一般使用在方法內部來完成類似"+"功能,因為是線程不安全的,所以用完以後可以丟棄。StringBuffer主要用在全域變數中。

(5)相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的效能提升,但卻要冒多線程不安全的風險。而在現實的模組化編程中,負責某一模組的程式員不一定能清晰地判斷該模組是否會放入多線程的環境中運行,因 此:除非確定系統的瓶頸是在 StringBuffer 上,並且確定你的模組不會運行在多線程模式下,才可以採用StringBuilder;否則還是用StringBuffer。

java String,StringBuffer,StringBuilder的區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.