C# String和StringBuilder的区别及性能详解
String在C#中其实是不可变的,每次操作字符串变量增加或减少时,都会重新分配内存。试想一下,如果创建一个循环10000次的字符串加减操作,每次循环都将一个字符连接到字符串,这样内存中就会有10000个字符串,每个字符串仅仅与前一个字符串相伴只是有一个字符不同,性能影响是很大的。这个时候我们可以使用StringBuilder分配一个缓存,其实就是创建个工作区,然后在工作区中对字符串应用StringBuilder类的相关方法。例如Append,Remove,Insert,Replace等。执行完之后,调用ToString方法把工作区中的内容转换为一个字符串,方便赋给一个字符串变量,相比之下在需要大量操作字符出变动时,应当使用StringBuilder提升程序性能。
String
- 它是引用类型,在堆上分配内存
- 每次增加&减少字符串时会产生一个新的实例
- String 对象一旦生成不可改变
- 定义相等运算符(== 和 !=)是为了比较 String 对象的值
在.NET中String是不可改变的引用类型对象,一旦创建了一个String对象并给它赋值,它就是不可再变的。这话听起来似乎有些不可思议,大家也许马上会想到字符串连接操作,我们不也可以改变字符串吗?让我们看下下面的这段代码
public static void Main(string[] args)
{
string str ="123";
Console.WriteLine(str); //输出 123
str = str+"456";
Console.WriteLine(str); //输出123456
Console.Read();
}
看起来似乎是把str的值从"123"改为了"123456",实际上并没有改变。string str = "123";是创建了一个String对象它的值是"123",sstr指向了它在内存中的地址,s += "456";是创建了一个新的String对象它的值是"123456",str指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了他们中的一个,但字符串"123"仍然在内存中驻留。
StringBuilder
StringBuilder对象为动态字符串,可以对其设置好的字符数量进行扩展。另外,还可以设置一个最大长度,这个最大长度称为该StringBuilder对象的容量,属性名叫Capacity。
为StringBuilder设置容量的意义在于,当修改StringBuilder字符串时,当实际字符长度未达到其容量之前,StringBuilder不会重新分配空间,StringBuilder默认初始分配16个字符长度;手动设置容量的方式有两种,代码如下
//通过构造函数设置容量
StringBuilder sb1=new StringBuilder("cisharp.com",100);
//通过Capacity属性设置容量
StringBuilder sb2=new StringBuilder("cisharp.com",100);
sb.Capacity=100;
StringBuilder常用方法
StringBuilder sb = new StringBuilder();
//追加字符串
sb.Append("111");
//追加一行
sb.AppendLine("111");
//插入字符串
sb.Insert(0, "22");
//移除字符串
sb.Remove(0, 2);
//替换字符串
sb.Replace("22", "33");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)