String 与 StringBuilder

本文解释了C#中字符串池的作用及如何避免重复存储相同字符串以节省内存资源,并介绍了StringBuilder类在字符串拼接中的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 C#和java一样,有一个“字符串池”,为什么要有这个东西呢?

在没有字符串池的情况下,比如用户定了
string a = "China";
那么相当于内存中有一块地方存储了China这个字符串
然后有定义了
string b = "China";
那么相当于内存中另一个地方又存储了China字符串,这不是重复了吗?一两个字符还没关系,但是在程序中,用到字符串的地方是很多的,特别有的地方需要用到大的文本,比如论文,字符串拼接什么的,这就会使内存大量消耗在了字符串的存储上,怎么办呢?所以就有了字符串池
程序一开始,字符串池是空的,如果用户有
string a = "China";
假设这相当于内存中的ACEF0002地址存储了China,
那么这个地址就会添加到字符串池,或者叫字符串地址列表中,
当用户定义string b = "China";时,编译器首先会去字符串池寻找是否有这个字符串,如果有,则证明该串之前曾用过,内存中已经有了,则直接让b指向ACEF0002,
同样,如果有定义
string c = "China";那么他同样会指向ACEF0002,也就是说,内存中始终只存储一次,这样就有效节省了内存资源。
除非这次遇到一个字符串池中没有的字符串,如定义
string z = "Chinese";
这时编译器发现字符串池中没有Chinese这个东西,因此他才会重新开辟一块空间来存储。
简单的说,字符串池好似一个地址集合,他存储了所有用户已经使用过的字符串地址,一旦发现新字符串在其中已经存在了,就直接用,否则才开辟新空间存储。

stringbuilder是一个用来拼接字符串的类,假设不用他,我们从键盘上输入5个字符来完成单子的拼接
1 string a = "";
2 a += scan.nextline();
3 a += scan.nextline();
4 a += scan.nextline();
5 a += scan.nextline();
6 a += scan.nextline();
以上代码执行后,五次输入分别输入"C","h","i","n","a",那么当第2行执行完后,字符串池如下
""
"C"
第3行执行完后,字符串池如下
""
"C"
"Ch"
第4行执行完后,字符串池如下
""
"C"
"Ch"
"Chi"
以此类推,也就是说,每次在原有的字符串后添加一个新字符,那么新的字符串必然是第一次出现,这就会导致字符串池中存储每一次拼接的过程,其实我们知道,我们要的只是最后的字符串。这个问题就要用到stringbuilder来解决。
StringBuilder sb = new StringBuilder();
此时sb的内容为"",
sb.append(scan.nextline());
sb.append(scan.nextline());
sb.append(scan.nextline());
sb.append(scan.nextline());
sb.append(scan.nextline());
执行以上五行语句时,依次输入"C","h","i","n","a",但是中间产生的"Ch","Chi"等字符串不会在字符串池中存放,也就是说,字符串池只对真正意义上的字符串String类起作用,系统不会为StringBuilder类型对象的每一次变化去重新开辟空间存储。
当5行语句执行完以后,你只需要这样做:
string str = sb.toString();
这样,只有最后的"China"才成为了一个字符串的实例,在拼接过程中间产生的那些没有用处的字符串不会占资源

因为没有每次申请空间去存字符串,因此stringbuilder拼接字符串的速度不尽快,而且节省资源,我曾经做过测试,如下代码:
int n = 90000;
string a = "";
StringBuilder b = new StringBuilder();
for(int i=0;i<n;i++)
{
    b.append("a");
}
Console.write(b.toString());
速度很快,如果将循环中的语句改为a+="a";则慢的不行,而且如果用stringbulder,n的值最高可以达到千万,而如果用string+=的方法,1百万就会定住不动,我也不知道是因为内存满了还是速度慢了

所以总结的说,如果程序涉及不到很多的字符串拼接,那么用string也无妨,毕竟现在的机器都很强了。
如果考虑到性能和执行效率问题,一般超过5次以上的字符串拼接,建议用sb类。如果你是写服务器,则要特别注意,因为服务器长期不关机,也就意味着内存长期不刷新,如果不注意资源的释放,很可能到后期就会变慢你还不知道是什么原因,用debug软件一看才知道,里面存的都是字符串,那能够不慢吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值