.NET中string与StringBuilder在字符串拼接功能上的比较

来自森大科技官方博客 http://www.cnsendblog.com/?p=86

.NET中string与StringBuilder在字符串拼接功能上的比较
string与StringBuilder的在字符串拼接时执行效率上有差异,因为StringBuilder类中用了一个技巧:它申请了两倍的内存空间存放字符串,在调用Append方法拼接字符串时,会先检查剩余的空间是否能放下要拼接的字符串,若能放下,则将要拼接的字符串Copy到剩余的空间中,若不能放下,则再申请拼接后的字符串两倍的长度空间,将当前字符串Copy到新的空间中(除了两倍的空间外,这点跟string的拼接没有太多的差异)。因此StringBuilder能提高字符串拼接的效率在于它减少了申请分配内存的次数,以及字符串Copy的数量。所以这里就有了以下4种情况的讨论:
  1.原来的长字符串拼接短字符串。
  这实际上就是最吻合StringBuilder申请多余空间的意图,能够达到最好的效果的一种情形。具体的情况是这样的,假设一个StringBuilder存放的初始字符串长度为1000,那么实例化这个StringBuilder时,会申请2000的空间,随后,每次拼接长度为20的字符串,则会直接将这长度为20的字符串按顺序放在剩下的1000空间里,直到放满为止,其间有50次的拼接操作,此时若再拼接一个长度为20的字符串时,因为空间不够,这是StringBuilder会申请2000*2=4000的空间,然后将原先已拼接的长度2000的字符串Copy进去后,继续拼接新的长度为20的字符串。这最后一步跟string操作的效率几乎一样的,主要是前面的50次拼接能减少50次的内存创建以及Copy全部字符串到新字符串的效率损耗。若是string进行拼接,则前50次拼接操作中,每次都会新分配一块内存,并将现有的字符串全部Copy到新的内存中。
  2. 原来的长字符串拼接长字符串。
  这种情况在开始时会因为空间很快被用完,并不能体现StringBuilder在字符串拼接方面的优势,但随着拼接次数的增加,会转换成第一种情况。
   3.原来的短字符串拼接短字符串。
   4.原来的短字符串拼接长字符串。

  其实后面三种情况都要根据实际来评估了,最终都是要向情况一进行转变。所以我们的关注点主要是被拼接的字符串与已有字符串之间长度的差距有多少,能减少多少次临时内存分配来达到提高字符串拼接效率的目的的。

原文地址:http://blog.51cto.com/14036626/2310398

时间: 2024-10-05 03:32:10

.NET中string与StringBuilder在字符串拼接功能上的比较的相关文章

java中String与StringBuilder的区别

本篇文章介绍了,java中String与StringBuilder的区别. 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类—— StringBuilder (先别忙着扔我砖头,我还算清醒,我这里说的不是 C #, Java 也有 StringBuilder 类).那么这个 StringBuilder 和

探秘Java中String、StringBuilder以及StringBuffer

探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于

java中String&StringBuffer&StringBuilder

1. String,字符串常量 StringBuffer,字符串变量(线程安全) StringBuilder,字符串变量(非线程安全) 2.String and StringBuffer String和StringBuffe的主要区别在于String是不可变对象,每次对String进行改变的时候其实 等于生成了一个新的String对象,因此经常改变内容的字符串不要使用String类型,因为每次形成新的对象都会对系统的性能产生影响,特别当内存中的无引用的对象多了之后,JVM的GC就会开始工作,那速

StringBuilder与StringBuffer的区别(转) &精简版StringBuilder,提速字符串拼接

以下这部分转子连接 http://www.cnblogs.com/Fskjb/archive/2010/04/19/1715176.html 相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.String类是不可变类,任何对String的改变都会引发新的String对象的生成:而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生

java中String、StringBuilder、StringBuffer三者的区别

在Java项目开发中,字符串是最长使用的数据类型,而有关字符串的String.StringBuilder.StringBuffer三者又常常让人分不清楚什么时候该使用哪个. 特此整理一下. String字符串常量 大家都知道String是一个不可变的类,任何对String的改变都会引发新的String对象的生成:因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,

java中String 、 StringBuilder 和 StringBuffer的联系与区别

String作为java中最基本的类,担负着承载字符信息的作用.String具有不可变的final属性 , 这也决定了它对于在程序中传递信息的不可或缺性 .开发中,我们常常要对字符串进行拼接,这时我们会用到String对象重载的“+”操作符或concat(str)方法,也可以用StringBuilder.StringBuffer对象的append(str)方法来实现. 那么,String.StringBuilder.StringBuffer之间到底有什么联系和区别? 什么情况下分别适合使用这三个

C#中string和StringBuilder的区别

string在任何语言中都有它的特殊性,在.NET中也是如此.它属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但它却放在了堆中. 一:不可改变对象 在.NET中String是不可改变对象,一旦创建了一个String对象并给它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值.这句活初听起来似乎有些不可思议,大家也许马上会想到字符串连接操作,我们不也可以改变字符串吗?看下面的这段代码: public static void Main(string[] args)

java中String、stringbuilder、stringbuffer区别

1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的.每次对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原String对象GC回收. Private final char value[]; StringBuider与stringbuffer都继承自AbstractStringBuider类,在abstractstringbuilder中也是

java中String、StringBuilder和StringBuffer理解

String.StringBuilder和StringBuffer理解 1>String java.lang.String 类 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache th