1. 程式人生 > >Java中String,StringBuilder和StringBuffer的區別

Java中String,StringBuilder和StringBuffer的區別

這三個類的主要區別在兩個方面:運算速度(運算效能或執行效率)和執行緒安全性。

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

String是final類不能被繼承且為字串常量,而StringBuilder和StringBuffer均為字串變數。String物件一旦建立便不可更改,而後兩者是可更改的,它們只能通過建構函式來建立物件,且物件被建立以後將在記憶體中分配記憶體空間,並初始儲存一個null,通過append方法向StringBuffer和StringBuilder中賦值。請看如下示例程式碼:

String str = "abc";
System.out.println(str);
str = str + "de";
System.out.println(str);

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

而StringBuilder和StringBuffer的物件是變數,對變數的操作是直接對該物件就行更改,因此不會進行反覆的建立和回收。所以在執行速度上比較快。

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

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

String str = "abcde";

但如下的程式碼寫法形式速度會很慢,JVM會不斷地建立和回收物件來進行操作。

String str1 = "abc";
String str2 = "de";
String str = str1 + str2;

2. 執行緒安全性

StringBuilder(非執行緒安全)

而StringBuilder的方法沒有該關鍵字修飾,所以不能保證執行緒安全性。是JDK1.5新增的,該類提供一個與StringBuffer相容的 API,但不能保證同步,所以在效能上較高。該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。 --------------------- 本文來自 rmn190 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/rmn190/article/details/1492013?utm_source=copy

StringBuffer(執行緒安全的)

StringBuffer中大部分方法由synchronized關鍵字修飾,在必要時可對方法進行同步,因此任意特定例項上的所有操作就好像是以序列順序發生的,該順序與所涉及的每個執行緒進行的方法呼叫順序一致,所以是執行緒安全的。類似於 String 的字串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,但通過某些方法呼叫可以改變該序列的長度和內容。StringBuffer 上的主要操作是 append 和 insert 方法,可過載這些方法,以接受任意型別的資料。每個方法都能有效地將給定的資料轉換成字串,然後將該字串的字元追加或插入到字串緩衝區中。append 方法始終將這些字元新增到緩衝區的末端;而 insert 方法則在指定的點新增字元。

3. 總結

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

StringBuilder:適用於單執行緒下在字串緩衝區進行大量操作。

StringBuffer:適用於多執行緒下在字串緩衝區進行大量操作。