C# String和StringBuilder的區別
轉自:https://mp.weixin.qq.com/s/8_gt0HQCO0vA26yvKUt6VA
面試題常問,拿來收藏。。
String和StringBuilder的區別
String型別物件的特點:
- 1.它是引用型別,在堆上分配記憶體
- 2.運算時會產生一個新的例項
- 3.String 物件一旦生成不可改變(Immutable)
- 4.定義相等運算子(== 和 !=)是為了比較 String 物件的值(而不是引用)
String,StringBuilder類之間關係:
乍一看它們都是用於處理字串的java類,而且長得也都差不多,相信肯定有人會以為StringBuilder都是繼承自String這個類,即認為String類是其他兩個類的超類。
但並非如此。
由此可以看出:
StringBuilder繼承自AbstractStringBuilder這個類,而AbstractStringBuilder和String都繼承自Object這個類(Object是所有java類的超類)。
String是不可變類,StringBuilder是可變類。
string本身是不可改變的,它只能賦值一次,每一次內容發生改變,都會生成一個新的物件,然後原有的物件引用新的物件,而每一次生成新物件都會對系統性能產生影響,這會降低.NET編譯器的工作效率。
StringBuilder類則不同,每次操作都是對自身物件進行操作,而不是生成新的物件,其所佔空間會隨著內容的增加而擴充,這樣,在做大量的修改操作時,不會因生成大量匿名物件而影響系統性能。
二者的執行效率:
首先建立一個String物件str,並把“abc”賦值給str,然後在第三行中,其實JVM又建立了一個新的物件也名為str,然後再把原來的str的值和“de”加起來再賦值給新的str,而原來的str就會被JVM的垃圾回收機制(GC)給回收掉了,所以,str實際上並沒有被更改,也就是前面說的String物件一旦建立之後就不可更改了。
public class test{ public static void main (String[] args) { String str="abc"; System.out.printin(str);//輸出abc str=str+"de"; System.out.printin(str);//輸出abcde } }
而StringBuilder和StringBuffer的物件是變數,對變數進行操作就是直接對該物件進行更改,而不進行建立和回收的操作,所以速度要比String快很多。
小技巧:
String:適用於少量的字串操作,字串不經常發生變化的時,我們可以優先使用string
HOW?
如果看了上面的解釋有些不明白的話,那就繼續往下看吧,下面的故事更精彩~
1、string
string是一個不可變的字串,每次對string型別進行運算(賦值或拼接)的時候其實相當於重新生成了一個新的string物件,然後指標指向了新的string物件,會對系統的效能產生影響,不適合大量、頻繁字串的拼接。
2、StringBuilder
stringBuilder提供 Append方法,能在已有物件的原地進行字串的修改,一般情況下看不出和string有和差異,但是如果對大量字串進行新增操作,stringbuilder耗費的時間比string少的多。
除了append的方法,還有其他方法:
StringBuilder.Append 將資訊追加到當前 StringBuilder 的結尾。
StringBuilder.AppendFormat 用帶格式文字替換字串中傳遞的格式說明符。
StringBuilder.Insert 將字串或物件插入到當前 StringBuilder 物件的指定索引處。
StringBuilder.Remove 從當前 StringBuilder 物件中移除指定數量的字元。
StringBuilder.Replace 替換指定索引處的指定字元。
其實還有一個stringBuffer,可將字串緩衝區安全的用於多個執行緒,可以在必要時同步,所以操作就像是以序列順序發生,該順序與所涉及到的每個執行緒進行的方法呼叫一致。
他們三者的優先使用順序:stringBuilder(快)>stringBuffer>string