1.其一
在运行速度方面:StringBuilder > StringBuffer > String
上实例
class Program
{
static void Main(string[] args)
{
TheTestString();
}
/// <summary>
/// string
/// </summary>
public static void TheTestString()
{
string str = null;
//创建计时器 头一回见 引这个 System.Diagnostics 命名空间
Stopwatch stopwatch = new Stopwatch();
//计时器 START
stopwatch.Start();
for (int i = ; i < ; i++)
{
str += i;
}
//计时器 END
stopwatch.Stop();
//输出STR
Console.WriteLine(str);
//输出程序运行时间
Console.WriteLine(stopwatch.Elapsed);
//控制台程序闪退的坑
Console.ReadKey();
}
}
class Program
{
static void Main(string[] args)
{
//TheTestString();
StringBuilder();
}
#region StringBuilder
public static void StringBuilder()
{
StringBuilder stringBuilder = new StringBuilder(); Stopwatch stopwatch = new Stopwatch();
//计时器 START
stopwatch.Start();
for (int i = ; i < ; i++)
{
stringBuilder.Append(i);
}
//计时器 END
stopwatch.Stop();
//输出STR
Console.WriteLine(stringBuilder);
//输出程序运行时间
Console.WriteLine(stopwatch.Elapsed);
//控制台程序闪退的坑
Console.ReadKey();
}
#endregion
}
上述两个例子只是for循环 从0 到99 博主笔记本有点卡 当数据庞大时优势就展示出了 铁证如山 ,就是有图有真相的那种 那么,
为什么会出现这种运行速度的差别,引出其二区别
2.其二
数据类型
string :乃字符串常量 引用数据类型,一旦创建即不可更改,stringbuilder:StringBuilder是一个可变的字符序列(百度百科)
又如
string str="张";
console.writeline(str);
str+="三";
console.writeline(str);
貌似从张变成了张三 但却为两个对象,变量名称相同但是 指向的堆中数据不同 一个指向 “张“,另一个指向 “张三“”
而反观stringbuilder以Char为单位向字符串分配空间,所以操作中不需要进行额外的内存分配
3.其三
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,
但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线
程的情况下,还是建议使用速度比较快的StringBuilder。(****)
ps:看一哈vs里面的监视器,今天OVER。