Java中String,StringBuilder和StringBuffer的區別

原文鏈接:https://blog.csdn.net/qushaming/article/details/82971901

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

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 要快。兩者的方法基本相同。

StringBuffer(線程安全的)

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

3. 總結

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章