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内存
运行结果: