在這一小節中,我們將學習String
,StringBuffer
與StringBuilder
之間的區別。StringBuffer
與StringBuilder
有什麼區別是一個流行的java面試問題。
本教學主要介紹String
類的主要功能,然後比較String
,StringBuffer
與StringBuilder
之間的區別。
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()
方法時,都會產生相同的輸出。對於呼叫者來說,它就像每次都在進行計算,但在內部它會被快取在雜湊欄位中。
由於String
在Java中是不可變的,因此每當執行字串操作(如連線,子字串等)時,它會生成一個新的String並丟棄舊的String以進行垃圾收集。
這些都是繁重的操作,並在堆中產生大量垃圾。所以Java提供了StringBuffer
和StringBuilder
類用於String
操作。
StringBuffer
和StringBuilder
是java中的可變物件,並為String
操作提供append()
,insert()
,delete()
和substring()
方法。
在Java 1.4之前,StringBuffer
是String
操作的唯一選擇,但它有一個缺點,即它的所有公共方法都是同步的。StringBuffer
提供執行緒安全性,但效能成本。
在大多數情況下,不在多執行緒環境中使用String
,因此Java 1.5引入了一個新的類StringBuilder
,類似於StringBuffer
,除了執行緒安全和同步。
因此,如果處於單執行緒環境中或者不關心執行緒安全性,則應使用StringBuilder
,否則請使用StringBuffer
。
String
是不可變的,而StringBuffer
和StringBuider
是可變類。StringBuffer
是執行緒安全和同步的,而StringBuilder
不是,因引StringBuilder
比StringBuffer
更快。+
操作符在內部使用StringBuffer
或StringBuilder
類。String
操作,應該使用StringBuilder
,否則使用StringBuffer
類。