C# stringbuilder为啥高效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# stringbuilder为啥高效相关的知识,希望对你有一定的参考价值。

C#语言还是比较常见的东西,这里我们主要介绍C# StringBuilder和String,包括介绍大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String等方面。

C# StringBuilder和String区别

String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String

另外,对于StringBuilder和String我们不得不多说几句:

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

2.运算时会产生一个新的实例

3.String 对象一旦生成不可改变(Immutable)

4.定义相等运算符(== 和 !=)是为了比较 String 对象(而不是引用)的值

C# StringBuilder和String示例:

using System; using System.Collections.Generic; using System.Text; namespace Example22 class Program static void Main(string[] args) const int cycle = 10000; long vTickCount = Environment.TickCount; String str = null; for (int i = 0; i < cycle; i++) str += i.ToString(); Console.WriteLine("String: 0 MSEL", Environment.TickCount - vTickCount); vTickCount = Environment.TickCount; //看到这个变量名我就生气,奇怪为什么大家都使它呢? :) StringBuilder sb = new StringBuilder(); for (int i = 0; i < cycle; i++) sb.Append(i); Console.WriteLine("StringBuilder: 0 MSEL", Environment.TickCount - vTickCount); string tmpStr1 = "A"; string tmpStr2 = tmpStr1; Console.WriteLine(tmpStr1); Console.WriteLine(tmpStr2); //注意后面的输出结果,tmpStr1的值改变并未影响到tmpStr2的值 tmpStr1 = "B"; Console.WriteLine(tmpStr1); Console.WriteLine(tmpStr2); Console.ReadLine();

参考资料:http://hi.baidu.com/%B3%C9%B6%BC%B9%FD%BF%CD/blog/item/d8775b9989092dbfc9eaf4e7.html

参考技术A stringbuilder与string比较你就会明白了

String是固定不变的,在进行字符串连接的时候是新建一个字符串,进行连接后,最后赋值,
如果对String赋值多次,就会在内存中保存多个这个对象的副本,浪费系统资源

StringBuilder是可变的,不用生成中间对象,拼接字符串比较多,或字符串的长度比较长时有较高的效率。
StringBuilder的内存空间不够也要扩容,如果分配的空间远远大于需要量,也很浪费
所以,初始化 StringBuilder的时候最好根据需要设置容量,避免浪费
参考技术B 高效只是相对的.

string是一个特殊的类型,具有不可变性(也就是一旦生成了就不能再修改),.net中string看起来可以修改的原因是生成了新对象(原字符串就被抛弃了,有可能会被驻留,有兴趣可以研究下).
stringbuilder内部维护了一个字符型的数组(预分配的空间默认是4).当修改它的内容时,它其实是在修改数组(所以不用生成字符串对象),当然造成的临时对象就会少很多.当数组满了以后,它会进行扩容(一般是2倍的扩张),因此尽量设置初始空间大小,否则不断的扩充中也会产生很多垃圾对象.

以上是关于C# stringbuilder为啥高效的主要内容,如果未能解决你的问题,请参考以下文章

StringBuilder

Java StringBuffer 和 StringBuilder 类

Java StringBuffer和StringBuilder类

我的jdk源码:StringBuilder 高效可多次修改String

StringBuilder

StringBuilder