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

018:String、StringBuilder和StringBuffer的區別

本文閱讀時間大約3分鐘。

參考回答

Java中的String物件是不可變物件,針對字串物件的操作(例如subString、contact、replace)都會生成一個新的String物件,如果應用中有大量這樣的操作,就會產生大量的臨時String物件,會影響Java應用執行的效能。

為瞭解決上面這個問題,JDK 1.0中提供了StringBuffer類,這個類的物件是可變物件,它的原理是申請一個緩衝區來存放字串,可以避免產生新的字串物件。但是StringBuffer是執行緒安全的,它的方法都被synchronized關鍵字修飾,導致它的效能不太好。

為瞭解決StringBuffer的效能問題,JDK1.5提供了一個非執行緒安全的StringBuilder類,現在很多字元操作的底層都是根據StringBuilder實現的,例如”+”操作、StringJoiner等等。

關於StringBuilder和StringBuffer的選擇:我們在編寫併發程式的時候,什麼時候需要兩個執行緒共享同一個字串物件呢?我目前沒有遇到過。

知識點梳理

  1. Java中String物件是不可變的

  2. Java支援透過構造方法或字面常量構建字串

  3. 字串物件存放的位置可能在堆記憶體,也可能在字串常量池。使用構造方法構建的字串物件一定在堆記憶體,如果堆該字串物件呼叫String.intern()方法,則可以將該字串移入字串常量池。

  4. 字串常量池在JVM底層本質上是一個Hashtable

  5. 字串上支援很多操作API,例如字串連線、擷取字串、trim、替換字元等等,這些操作看似是寫操作,實際上都會傳回一個新的字串

  6. 字串的連線操作有幾種方式:“+”運運算元多載,底層是依靠StringBuilder實現的;String.contact()方法,底層是依賴Array.copy實現的;StringBuilder,透過預先分配一個字元緩衝區來進行字串的連線,適合大批次字串連線的情況

  7. String、StringBuilder和StringBuffer的底層資料結構都是char[]陣列,不同的是String將該char陣列設定成了不可變的(final),透過這個關鍵字實現了不可變物件。

  8. StringBuilder是JDK1.5提供的,目的是補充StringBuffer用在單執行緒環境下——不必要且效能低的不足。

 你再主動一點點   我們就有故事了

下方檢視歷史文章

017:為什麼不建議在迴圈中使用“+”拼接字串

016:字串物件在JVM中是如何存放的

015:為什麼Java中的字串物件是不可變的

工程思維:Everything is a project

【筆記】如何理解軟體工程