StringBuilder和String的区别?

 StringBuilder和String对象都可以很方便的处理字符串,他们具备各自的特点,如下:

  System.String具有以下五个特点:

1.  String是引用类型,在堆上分配内存。

2.  String对象一旦生成,就不可改变(Immutable)。

3.  String提供了大量便捷的字符串操作函数。

4.  String运算时会产生一个新的实例。

5. 在程序中定义相等运算符(==)和(!=),可以方便比较String对象的值(而不是引用)。

StringBuilder具有以下两个特点:

 StringBuilder对象是动态对象,允许扩充它所封装的字符串中的字符数量。

 StringBuilder可以用于修改StringBuilder中的内容。

 

由于String对象一旦声称,就不可改变,所以每次使用System.String类中的方法时,都需要在内存中创建一个新的字符串对象,这会分配新的空间给新的对象。如果对字符串执行重复修改,创建一个新的String对象导致 的系统开销可能会非常昂贵。如果不创建新的对象,只是修改字符窜,则可以使用StringBuilder类。StringBuilder类型可以很好的解决字符串操作的性能问题,在它声称String对象之前,将不会产生任何String对象。以下示例代码对使用StringBuilder和使用String的性能差异做了比较。代码如下:

View Code

结果如下:

useStringBuilder:6
useString:1866

结果悬殊差别好大。

 

System.String   引用类型



基本成员:



Length  返回字符串的长度。



Contains()  判断当前字符串对象是否包含一个指定的字符串对象。



Insert()  用来接收新插入字符串数据后的当前的字符串的副本。(string的“副本“特点)



Remove()/Replace()  接收一个带有修改(被删除或替换的字符)了的字符串的副本。



Substring()  返回当前字符串的子字符串。



ToCharArray()  返回一个表示当前字符串的资附数组。



ToUpper()/ToLower()  创建当前字符串的大小写副本。



Format()  格式化一个字符串的字面量。



String的相等性运算(==和!=)比较的是字符串对象的值,而非比较者所引用的内存。



拼接操作:+或静态的System.Concat()方法。



索引器访问字符串:



(1)String str="123456";



for(int i=0;k<str.Length;i++)



Console.WriteLine("Char {0} is {1}",i,str);



(2)System.String中维护者也个System.Char类型的数组--〉



String str="123456";



foreach(char c in str)  Console.WriteLine(c);



 



System.Text.StringBuilder:



StringBuilder提供了对底层缓冲区的直接访问。与System.String一样,System.Text.Builder提供了用来从对象中追加,格式化,插入和删除数据的大量成员。



区别:



String的功能已经使得他在处理字符类类型上面应经很完美了。但是在创建大量使用文本数据的程序时,它的效率就显得低了些。原因就是:当优点太优了的时候,从另一方面看时可能也会是缺点(牺牲其它方面)。--〉.NET字符串的一个非常重要的事实,字符串一旦建立,它的值就将不可再被修改。表面上我们可以给字符串变量任意赋新值,但实际上并没有修改已存在的字符串对象的底层缓存区,而是字符串变量(引用型)指向了新的字符串对象,原先的字符串最终将被垃圾回收掉。字符串的拼接,转换大小写等于此情况类似,



StringBuilder:解决了String重复开辟空间对资源的浪费。它提供了对底层缓冲区的直接访问。长度是可变的。创建对象的同时可以指定对象所包含的字符串的初始个数,默认情况容量16。缓冲区会在初始容量不足时实时的调整大小。



总:在许多情况下,应选择System.String表示文本,对多数应用程序来说,可以忽略返回一个修改的字符数据的副本的开销。但是,若创建的是一个文本密集的应用程序(如一个字符处理程序),使用System.Text.StringBuilder的性能要好得多。

 

你可能感兴趣的:(StringBuilder)