在這一小節中,我們將學習String
,StringBuffer
與StringBuilder
之間的區別。StringBuffer
與StringBuilder
有什麼區別是一個流行的java面試問題。
本教程主要介紹String
類的主要功能,然後比較String
,StringBuffer
與StringBuilder
之間的區別。
1. String
String
類表示字串,可以通過兩種方式實例化String
。String str = "abc"; // 或者 String str = new String ("abc");
String
在Java中是不可變的,因此很容易在不同的線程或函數之間共用它。當使用雙引號創建
String
時,它首先在JVM字串池中查找具有相同值的String
,如果找到它則返回引用,否則它將創建String
對象,然後將它放入String
池中。這樣JVM通過在不同的線程中使用相同的String
來節省大量空間。但是如果使用新的運算符,它會在堆記憶體中顯式創建一個新的String
。+
運算符為String
重載並用於連接兩個字串。雖然在內部它使用StringBuffer
來執行此操作。String
覆蓋equals()
和hashCode()
方法,只有兩個字串在相同的順序中具有相同的字元時才相等。請注意,equals()
方法區分大小寫,如果不查找區分大小寫的檢查,則應使用equalsIgnoreCase()
方法。String
表示UTF-16
格式的字串。String
是一個final
類,除了private int hash
字段之外,所有字段都是final
。此字段包含hashCode()
函數值,僅在調用hashCode()
方法並在此字段中緩存時創建。此外,使用String
類的final
字段和一些計算生成散列,因此每次調用hashCode()
方法時,都會產生相同的輸出。對於調用者來說,它就像每次都在進行計算,但在內部它會被緩存在哈希字段中。
2. String與StringBuffer
由於String
在Java中是不可變的,因此每當執行字串操作(如連接,子字串等)時,它會生成一個新的String並丟棄舊的String以進行垃圾收集。
這些都是繁重的操作,並在堆中產生大量垃圾。所以Java提供了StringBuffer
和StringBuilder
類用於String
操作。
StringBuffer
和StringBuilder
是java中的可變對象,並為String
操作提供append()
,insert()
,delete()
和substring()
方法。
3. StringBuffer 與 StringBuilder
在Java 1.4之前,StringBuffer
是String
操作的唯一選擇,但它有一個缺點,即它的所有公共方法都是同步的。StringBuffer
提供線程安全性,但性能成本。
在大多數情況下,不在多線程環境中使用String
,因此Java 1.5引入了一個新的類StringBuilder
,類似於StringBuffer
,除了線程安全和同步。
因此,如果處於單線程環境中或者不關心線程安全性,則應使用StringBuilder
,否則請使用StringBuffer
。
4. String,StringBuffer與StringBuilder
String
是不可變的,而StringBuffer
和StringBuider
是可變類。StringBuffer
是線程安全和同步的,而StringBuilder
不是,因引StringBuilder
比StringBuffer
更快。- String 連接
+
操作符在內部使用StringBuffer
或StringBuilder
類。 - 對於非多線程環境中的
String
操作,應該使用StringBuilder
,否則使用StringBuffer
類。