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为啥高效的主要内容,如果未能解决你的问题,请参考以下文章
Java StringBuffer 和 StringBuilder 类
Java StringBuffer和StringBuilder类