Java 中 String 與 StringBuffer 和 StringBuilder 的差別
介紹
String 是 Java 中很常用的類之一,同時,字元串是 Java 面試中最重要的話題之一。
StringBuffer 和 StringBuilder 類提供了操作字元串的方法。
我們将研究 StringBuffer 和 StringBuilder 之間的差別。
StringBuffer 與 StringBuilder 的差別是 Java 中很常見的面試題。
在控制台上列印程式的内容,可以使用 String。此部落格介紹 String 類的主要功能,然後我們将比較 StringBuffer 和 StringBuilder 類。
String
注意一個常見的錯誤,不要記錯了。因為 String 是 final 修飾的,無法被繼承。是以 String 不是 Java 的基本資料類型。
字元串在 Java 中是不可變的,是以适合在多線程環境下使用。
當我們使用雙引号建立一個字元串時,如下,JVM 首先在字元串池中尋找具有相同值的字元串。
String str1 = "ABC";
如果找到了,它将傳回字元串池中的字元串對象的引用。否則,它會在字元串池中建立字元串對象并傳回引用。JVM 通過在不同的線程中使用相同的字元串,節省了大量的記憶體。
如果使用 new 運算符建立字元串,則會在堆中建立它。
運算符
+
是為 String 重載的,我們可以用它來串聯兩個字元串。盡管在内部它使用 StringBuilder 來執行這個動作。
兩個字元串隻有在它們具有相同字元串的時候才相等,equals() 方法區分大小寫。如果您正在尋找不區分大小寫的檢查,您應該使用 equalsIgnoreCase() 方法。
拼接字元串
由于 String 在 Java 中是不可變的,是以每當我們執行字元串拼接操作時,它都會生成一個新的 String 并丢棄舊的 String 以進行垃圾收集。
這些重複的操作會在堆中産生大量垃圾備援。是以 Java 提供了 StringBuffer 和 StringBuilder 類,應該用于字元串操作。
StringBuffer 和 StringBuilder 是 Java 中的可變對象。
它們為字元串操作提供了
append
、
insert
delete
和
substring
方法。
StringBuffer | StringBuilder |
---|---|
線程安全 | 非線程安全 |
同步 | 非同步 |
始于 Java 1.0 | 始于 Java 1.5 |
慢 | 快 |
在 Java 1.4 之前,StringBuffer 是字元串操作的唯一選擇。但是,它的一個缺點是所有公共方法都是同步的。 StringBuffer 提供線程安全性,但以性能為代價。
在大多數情況下,我們不會在多線程環境中使用 String。是以 Java 1.5 引入了一個新類 StringBuilder,除了線程安全和同步之外,它與 StringBuffer 類似。
StringBuffer 有一些額外的方法,例如 substring, length, capacity, trimToSize 等。但是,這些不是必需的,因為 String 中也有所有這些。這就是為什麼這些方法從未在 StringBuilder 類中實作的原因。
StringBuffer 是在 Java 1.0 中引入的,而 StringBuilder 類是在檢視 StringBuffer 的缺點後在 Java 1.5 中引入的。
假設在單線程環境中或無關線程安全,要使用 StringBuilder。反之,使用 StringBuffer 進行線程安全的操作。
總結
- String 是不可變的,而 StringBuffer 和 StringBuilder 是可變類。
- StringBuffer 是線程安全和同步的,而 StringBuilder 不是。這就是 StringBuilder 比 StringBuffer 快的原因。
- 字元串連接配接運算符 (+) 在内部使用 StringBuilder 類。
- 對于非多線程環境中的字元串操作,我們應該使用 StringBuilder 否則使用 StringBuffer 類。