String,StringBuilder和StringBuffer的區別


1、運算速度比較(通常情況下):StringBuilder > StringBuffer > String

  String是final類不能被繼承且為字符串常量,而StringBuilder和StringBuffer均為字符串變量。

  String對象一旦創建便不可更改,而后兩者是可更改的,它們只能通過構造函數來建立對象,且對象被建立以后將在內存中分配內存空間,並初始保存一個null,通過append方法向StringBuffer和StringBuilder中賦值。

  請看如下示例代碼:

1 String str = "abc"; 2 System.out.println(str); 3 str = str + "de"; 4 System.out.println(str);

  上述代碼先創建一個String對象str,並賦值abc給str,然后運行到第三行,JVM會再創建一個新的str對象,並將原有str的值和de加起來再賦值給新的str。而第一個創建的str對象被JVM的垃圾回收機制(GC)回收掉。所以str實際上並沒有被更改,即String對象一旦創建就不可更改。所以Java中對String對象進行的操作實際上是一個不斷創建並回收對象的過程,因此在運行速度上很慢。

  而StringBuilder和StringBuffer的對象是變量,對變量的操作是直接對該對象進行更改,因此不會進行反復的創建和回收。所以在運行速度上比較快。

1 String str = "abc" + "de"; 2 StringBuilder stringBuilder = new StringBuilder().append("abc").append("de"); 3 System.out.println(str); 4 System.out.println(stringBuilder.toString());

上述代碼中String的操作速度反而要比StringBuilder快,這是因為在JVM眼里,第1行的代碼操作和下列代碼是完全一樣的,所以很快。

1 String str = "abcde";

但如果你的字符串是來自另外的String對象的話,速度就沒那么快了。

如下的代碼寫法形式速度會很慢,JVM會不斷地創建和回收對象來進行操作。

1 String str1 = "abc"; 2 String str2 = "de"; 3 String str = str1 + str2;

 

2、StringBuffer 和 StringBuilder 的類結構:

 

 

 

3. 線程安全性

(1)StringBuilder(非線程安全)

  StringBuilder的方法沒有synchronized關鍵字修飾,所以不能保證線程安全性。是JDK1.5新增的,該類提供一個與StringBuffer兼容的 API,但不能保證同步,所以在性能上較高。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。

  StringBuilder代碼片段:

 

 

 

(2)StringBuffer(線程安全的)

  StringBuffer中所有剛開方法都由synchronized關鍵字修飾,在必要時可對方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致,所以是線程安全的。類似於 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區中。append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符。

  StringBuffer代碼片段:

 

 

4、緩沖區

StringBuffer 代碼片段:

 

 StringBuilder 代碼片段:

 

 

 

StringBuffer 每次獲取 toString 都會直接使用緩存區的 toStringCache 值來構造一個字符串。

StringBuilder 則每次都需要復制一次字符數組,再構造一個字符串。

所以, StringBuffer 對緩存區優化,不過 StringBuffer 的這個toString 方法仍然是同步的。

 

5. 總結

  String:適用於少量的字符串操作。

  StringBuilder:適用於單線程下在字符串緩沖區進行大量數據操作。

  StringBuffer:適用於多線程下在字符串緩沖區進行大量數據操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM