本文閱讀時間大約3分鐘。
Java中的String物件是不可變物件,針對字串物件的操作(例如subString、contact、replace)都會生成一個新的String物件,如果應用中有大量這樣的操作,就會產生大量的臨時String物件,會影響Java應用執行的效能。
為瞭解決上面這個問題,JDK 1.0中提供了StringBuffer類,這個類的物件是可變物件,它的原理是申請一個緩衝區來存放字串,可以避免產生新的字串物件。但是StringBuffer是執行緒安全的,它的方法都被synchronized
關鍵字修飾,導致它的效能不太好。
為瞭解決StringBuffer的效能問題,JDK1.5提供了一個非執行緒安全的StringBuilder類,現在很多字元操作的底層都是根據StringBuilder實現的,例如”+”操作、StringJoiner等等。
關於StringBuilder和StringBuffer的選擇:我們在編寫併發程式的時候,什麼時候需要兩個執行緒共享同一個字串物件呢?我目前沒有遇到過。
-
Java中String物件是不可變的
-
Java支援透過構造方法或字面常量構建字串
-
字串物件存放的位置可能在堆記憶體,也可能在字串常量池。使用構造方法構建的字串物件一定在堆記憶體,如果堆該字串物件呼叫String.intern()方法,則可以將該字串移入字串常量池。
-
字串常量池在JVM底層本質上是一個Hashtable
-
字串上支援很多操作API,例如字串連線、擷取字串、trim、替換字元等等,這些操作看似是寫操作,實際上都會傳回一個新的字串
-
字串的連線操作有幾種方式:“+”運運算元多載,底層是依靠StringBuilder實現的;String.contact()方法,底層是依賴Array.copy實現的;StringBuilder,透過預先分配一個字元緩衝區來進行字串的連線,適合大批次字串連線的情況
-
String、StringBuilder和StringBuffer的底層資料結構都是char[]陣列,不同的是String將該char陣列設定成了不可變的(final),透過這個關鍵字實現了不可變物件。
-
StringBuilder是JDK1.5提供的,目的是補充StringBuffer用在單執行緒環境下——不必要且效能低的不足。
你再主動一點點 我們就有故事了