String,StringBuilder 以及StringBuffer 這三個類別的關係與差異一直是Java 的經典問題,這次就來講一下關於這三個類別的一些知識
String : 字元常數
StringBuilder : 字元變數
StringBuffer : 字元變數
#String 屬於常數類型,被宣告為final class,所有的屬性也都是final 類型,因此String 物件一旦創建,便不可更改;
StringBuilder / StringBuffer 兩個類別屬於變數類型,是可以更改的,它們都是為了解決字串由於拼接產生太多中間物件的問題而提供的類別。
執行速度 StringBuilder >StringBuffer >String
線程安全:StringBuffer
非線程安全: StringBuilder
StringBuilder 在本質上和StringBuffer 沒有太大區別,但是由於StringBuilder 去掉了StringBuffer 擁有的線程安全部分,因此有效減少了開銷。因此,StringBuilder 是大部分情況下字串拼接操作的首選
String s = "abcd"; s = s + "fgh";
很多人作這樣的字串處理的時候會誤以為String 類型是可變的。
但其實JVM 處理這段程式碼的過程是這樣的:首先創建s 對象,賦值“abcd” ,然後處理第二行程式碼時,再創建一個s 對象,賦值“abcdfgh”,然後將第一個s 對象垃圾回收。
所以相當於第一個s 沒更改過,第二個s 是新的物件
String str = “This is only a” + “simple” + “test”;
這段程式碼相當於String str = “This is only a simple test”;
String str2 = "This is only a"; String str3 = "simple"; String str4 = "test"; String str1 = str2 +str3 + str4;
這段程式碼同樣會按照例一的過程來處理
這兩個物件在建構的過程中,首先依照預設大小申請一個字元數組(char[]), 預設容量為16 個字符,但如果超出,會使用Arrays. copyOf() 成倍擴容16,32,64, 128...,當然這樣會影響效能,因此可以在建立物件時按照需要自訂其容量
//默认 16 个字符 public StringBuilder() { super(16); } //构造函数定义容量 public StringBuilder(int capacity) { super(capacity); }
我們都知道,進行字串拼接操作時推薦使用StringBuilder,但是是不是什麼時候都推薦使用StringBuilder 來取代String 進行字串拼接?顯然不是的。
String str = "123"; String str1 = str + "456"; String str2 = new StringBuilder().append(str).append("def").toString();
在這種情況下,兩種處理方式效率差異不大
在JDK 8 中, String 的字串拼接操作會被編譯器自動轉換為StringBuilder 並呼叫append 方法,由於這樣的最佳化方案,使得兩個類別在這種情況下的處理效率差異不大;而在JDK 9 中,為了更統一字串操作優化,提供了StringConcatFactory,作為一個統一的入口,更優化了字串拼接操作。
String str = ""; for (int i = 0; i < 1000; i++) { str += "12345"; } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 1000; i++) { stringBuilder.append("12345"); }
這種情況下,StringBuilder 更快
在循環中,每執行一次“ ”,都會建立一個String對象,因此會有大量物件創建和回收的消耗。
簡單來說,在迴圈中對同一個字串物件做字串拼接,優先選擇StringBuilder
String str1 = "123" + "456" + "789"; String str2 = new StringBuilder("123").append("456").append("789").toString();
#這種情況下,String 更快
我們都知道String str1 = "123" "456" "789";
其實是等同於String str1 = "123456789";
的,而StringBuilder 反而需要多次呼叫append 方法。
以上是你必須搞清楚的String,StringBuilder,StringBuffer的詳細內容。更多資訊請關注PHP中文網其他相關文章!