在這一小節中,我們將學習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類。
