1. 程式人生 > 其它 >C# String和StringBuilder的區別

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