歡迎光臨
每天分享高質量文章

淺談 Java 字串

(點選上方公眾號,可快速關註)


來源:飄過的小牛 ,

github.thinkingbar.com/how-to-use-string/

我們先要記住三者的特徵:

  • String 字串常量

  • StringBuffer 字串變數(執行緒安全)

  • StringBuilder 字串變數(非執行緒安全)

一、定義

檢視API會發現,String、StringBuffer、StringBuilder都實現了 CharSequence介面,雖然它們都與字串相關,但是其處理機制不同。

  • String:是不可改變的量,也就是建立後就不能在修改了。

  • StringBuffer:是一個可變字串序列,它與String一樣,在記憶體中儲存的都是一個有序的字串序列(char型別的陣列),不同點是StringBuffer物件的值都是可變的。

  • StringBuilder:與StringBuffer類基本相同,都是可變字元換字串序列,不同點是StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的。 在效能方面,由於String類的操作是產生新的String物件,而StringBuilder和StringBuffer只是一個字元陣列的擴容而已,所以String類的操作要遠慢於StringBuffer和StringBuilder。

二、使用場景

  • 使用String類的場景:在字串不經常變化的場景中可以使用String類,例如常量的宣告、少量的變數運算。

  • 使用StringBuffer類的場景:在頻繁進行字串運算(如拼接、替換、刪除等),並且執行在多執行緒環境中,則可以考慮使用StringBuffer,例如XML解析、HTTP引數解析和封裝。

  • 使用StringBuilder類的場景:在頻繁進行字串運算(如拼接、替換、和刪除等),並且執行在單執行緒的環境中,則可以考慮使用StringBuilder,如SQL陳述句的拼裝、JSON封裝等。

三、分析

簡要的說, String 型別和 StringBuffer 型別的主要效能區別其實在於 String 是不可變的物件, 因此在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String 物件。所以經常改變內容的字串最好不要用 String ,因為每次生成物件都會對系統效能產生影響,特別當記憶體中無取用物件多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。

而如果是使用 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

Java.lang.StringBuffer是執行緒安全的可變字元序列。一個類似於 String 的字串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,但透過某些方法呼叫可以改變該序列的長度和內容。在程式中可將字串緩衝區安全地用於多執行緒。而且在必要時可以對這些方法進行同步,因此任意特定實體上的所有操作就好像是以序列順序發生的,該順序與所涉及的每個執行緒進行的方法呼叫順序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可多載這些方法,以接受任意型別的資料。每個方法都能有效地將給定的資料轉換成字串,然後將該字串的字元追加或插入到字串緩衝區中。append 方法始終將這些字元新增到緩衝區的末端;而 insert 方法則在指定的點新增字元。

例如,如果 z 取用一個當前內容是“start”的字串緩衝區物件,則此方法呼叫 z.append(“le”) 會使字串緩衝區包含“startle”(累加);而 z.insert(4, “le”) 將更改字串緩衝區,使之包含“starlet”。

在大部分情況下 StringBuilder > StringBuffer

java.lang.StringBuilder一個可變的字元序列是JAVA 5.0新增的。此類提供一個與 StringBuffer 相容的 API,但不保證同步,所以使用場景是單執行緒。該類被設計用作 StringBuffer 的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的使用方法基本相同。

看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,提升Java技能

贊(0)

分享創造快樂