String,StringBuffer,StringBulider的區別

 

String是固定長度的字符串,如果要發生變化必須重新生成新的實例;
String 字符串常量
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)
簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 效率是遠要比StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不佔優勢。其實這是 JVM 的一個把戲,在 JVM 眼裏,這個
String S1 = “This is only a” + “ simple” + “test”; 其實就是:
String S1 = “This is only a simple test”; 所以當然不需要太多的時間了。但大家這裏要注意的是,如果你的字符串是來自另外的 String 對象的話,速度就沒那麼快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
這時候 JVM 會規規矩矩的按照原來的方式去做,在大部分情況下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer線程安全的可變字符序列。一個類似於 String 的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。
可將字符串緩衝區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而 insert 方法則在指定的點添加字符。
例如,如果 z 引用一個當前內容是“start”的字符串緩衝區對象,則此方法調用 z.append("le") 會使字符串緩衝區包含“startle”,而 z.insert(4, "le") 將更改字符串緩衝區,使之包含“starlet”。
java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比StringBuffer 要快。兩者的方法基本相同。
 在Java語言體系中,用於聲明變量的基本數據類型只有8種:boolean,char,byte,short,int,long,float,double。

與C/C++語言不同的是java中並沒有把字符串作爲一種基本的數據類型,而是在java.lang包中提供了處理字符串的類String,該類用於處理“不可變”的字符串;與之對應的還有,StringBuffer類用於處理“可變的”字符串。

注意:這兩種類都被聲明爲final型,因此不可以被當做父類繼承使用。

一、String類

由類String所創建的對象在創建之後是不可以更改的,被視爲常量。

舉例說明:

subString是String類中重要的處理字符串的方法

String str = "Hello world!";

Str = str.subString(6);

在上述語句中,str.subString(6);重新創建了一個字符串String對象,然後把這個對象賦值給str。

 

 

二、StringBuffer類

StringBuffer類是字符串緩衝區存儲類,創建是可以更改長度的字符串對象,該字符串被視爲常量,可以調用類方法改變字符串的長度和內容。

實現機理:創建對象時開闢一個緩衝區存放字符串序列,可以向字符串追加、插入操等作。在超過緩存區的容量時,java會自動擴大緩衝區的容量,保證操作的安全性。

 

 

三、StringBuilder類

StringBuilder類使用方法和StringBuffer類類似。

區別:StringBuffer類適用於多線程方法,StringBuilder類適用於單線程操作。StringBuilder對象的執行效率比StringBuffer對象要高。

StringBuilder是J2SE   5.0才新增的類,在J2SE   5.0之前的版本若有相同的需求,則使用java.lang.StringBuffer。事實上,StringBuilder被設計爲與StringBuffer具有相同的操作接口。在單機非多線程(Multithread)的情況下使用StringBuilder會有較好的效率,因爲StringBuilder沒有處理同步(Synchronized)問題。StringBuffer則會處理同步問題,如果StringBuilder會在多線程下被操作,則要改用StringBuffer,讓對象自行管理同步問題。

 

 

 

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章