String和StringBuilder的区别

String是固定不变的,在进行字符串连接的时候是新建一个字符串进行赋值,如果对String赋值多次,就会在内存中保存多个这个对象的副本,浪费系统资源。
StringBuilder是可变的,不用生成中间对象,对于连接字符串操作比较多,或字符串的长度比较长时有较高的效率。
注意:StringBuilder的内存空间不够也要扩容,如果分配的空间远远大于需要量,也会产生浪费。

实际例子
string s = "";
for (int i = 0; i < 10; i++)
{
    s += i.ToString();
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
    sb.Append(i.ToString());
}
           
区别在于:
第一种的for产生了:
"0","1"..."9"(10个由i.ToString产生)
"0","01"..."01...89"(10个由+=产生)
总共20个字符串实例

第二种的for产生了:
"0","1"..."9"(10个由i.ToString产生)
总共10个字符串实例

当循环次数和连接的字符串长度增加时,StringBuilder越发表现出优势。
运行程序
static void Main(string[] args)
{
    DateTime d1 = new DateTime();
    DateTime d2 = new DateTime();
    String s = "";
    StringBuilder sb = new StringBuilder();

    d1 = DateTime.Now;
    for (int i = 0; i <= 60000; i++)
    {
        sb.Append("AppendString123321");
    }
    d2 = DateTime.Now;
    double tt = ((TimeSpan)(d2 - d1)).TotalSeconds;
    Console.WriteLine("StringBulider消耗的时间={0}", tt);

    Console.WriteLine("程序正在执行.....");

    d1 = DateTime.Now;
    for (int i = 0; i <= 60000; i++)
    {
        s += "AppendString123321";
    }
    d2 = DateTime.Now;
    double tt2 = ((TimeSpan)(d2 - d1)).TotalSeconds;
    Console.WriteLine("String消耗的时间={0}", tt2);

    Console.WriteLine("StringBulide比String块{0}倍", tt2 / tt);
    Console.WriteLine("程序结束");
    Console.Read();
}
运行环境:AMD速龙双核5200+ 2.7GHz,1.75GB内存
运行结果

posted @ 2009-07-28 10:14  DaCHun  阅读(273)  评论(0编辑  收藏  举报