C#中String与StringBuilder的区别

本文通过实例演示了在C#中使用StringBuilder类进行字符串操作的高效性,相较于传统字符串,StringBuilder在频繁修改字符串时提供了更高的性能。通过对比字符串全字母替换过程中的内存分配与释放,展示了StringBuilder如何避免大量内存碎片生成,显著提高操作效率。
  1. 转自:http://blog.youkuaiyun.com/aladdinty/article/details/3447386
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace 字符串
  6. {
  7.     class Program
  8.     {
  9.         static void Main( string[] args )
  10.         {
  11.             //字符串频繁分配内存演示(不推荐)
  12.             //以下代码将字符串全总向后移一个值,原来的字符串将会被替换成新加密后的.
  13.             //但是效率低下,greetingTxt这个string类型的对象,每次 += 时其实就是将原来的对象删除引用,从而指向新的引用对象.
  14.             //这样在循环中,多次对string重新分配内存,堆中将会产生大量的废弃数据等待回收..
  15.             string greetingTxt = "Hello from all the guys atWrox Press. ZZZAAA";
  16.             for ( int i = 'z' ; i >= 'a' ; i-- )
  17.             {
  18.                 char old = ( char )i;
  19.                 char new1 = ( char ) (i + 1);
  20.                 greetingTxt = greetingTxt.Replace( old , new1 );
  21.             }
  22.             for ( int i = 'Z' ; i >= 'A' ; i-- )
  23.             {
  24.                 char old = ( char )i;
  25.                 char new1 = ( char )( i + 1 );
  26.                 greetingTxt = greetingTxt.Replace( old , new1 );
  27.             }
  28.             Console.WriteLine( greetingTxt );
  29.             Console.WriteLine( "StringBuilder----------------------------------" );
  30.             //StringBuilder 演示
  31.             //StringBuilder类只支持一般的字符串删除增加功能,不像String那么的多,但是效率极高
  32.             //String通常分配堆空间时,是刚刚好的大小.而StringBuilder一般会比需要的内存分配的多一些
  33.             //开发人员也可以指定StringBuilder要分配多少内存
  34.             // 2个重要属性 Length 字符串的实际长度  Capacity 字符串存储单元的最大长度(也就是最多可以占多少内存)
  35.             //这样,字符串的替换的效率就提高了,因为可以在StringBuilder分配的空余空间中进行操作.
  36.             //但是,删除增加字符串时,仍有一定影响,因为这样会涉及到存储大小的变
  37.             //通常如果增加一个字符串,超出本对象大小时,对象内存会自动翻版,以保证所需
  38.             //第二个参数是指字符对象最大数,通常应设一个尽量可能大的数.以确保不会重新扩展内存
  39.             StringBuilder sbStr = new StringBuilder( "Hello from all the guys atWrox Press.  " , 150 );
  40.             Console.WriteLine( "Hello from all the guys atWrox Press".Length + "字符串大小"); 
  41.             //很明显字符串大小是36,而我们给sb对象分配了150个字符的大小空间,这样我们假定我们append的新字符不会超出150-36
  42.             //那么sb对象将不会重新分配内存,我们的效率也就提高了
  43.             sbStr.Append( " Hello Aladdin!");
  44.             Console.WriteLine( sbStr );
  45.             //但是多次频繁替换文件,才能真正用到sb所带来的效率,同样是上面的加密小例,我们用sb对象执行
  46.             for ( int i = 'z' ; i >= 'a' ; i-- )
  47.             {
  48.                 char old = ( char )i;
  49.                 char new1 = ( char )( i + 1 );
  50.                 sbStr = sbStr.Replace( old , new1 );
  51.             }
  52.             for ( int i = 'Z' ; i >= 'A' ; i-- )
  53.             {
  54.                 char old = ( char )i;
  55.                 char new1 = ( char )( i + 1 );
  56.                 sbStr = sbStr.Replace( old , new1 );
  57.             }
  58.             Console.WriteLine( sbStr + "加密后" );
  59.             //以上代码使用了StringBuilder类的Replace方法,他不用在过程中复制字符串,效率会很高。
  60.             //StringBuilder类中除了Length 与 Capacity两个重要属性之外,还有一个MaxCapacity
  61.             //MaxCapacity是指最大的字符个数,一般默认是与int类型大小一样。int.MaxValue!
  62.             //不过可以显示的给定他的值,但是如果给定的最大值比指定的字符串空间大小小的话,会有一个异常
  63.             //例:我们把MaxCapacity给定为100,而Capacity是150,这时会有一个异常
  64.             StringBuilder sb = new StringBuilder( 100 ,50 );
  65.             //总结: 一般StringBuilder用于字符串的操作,而;String用与字符串的展示!
  66.             Console.ReadLine();
  67.         }
  68.     }
  69. }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值