StringBuilder的实现与技巧
在上一篇进一步了解String 中,发现了string的不便之处,而string的替代解决方案就是StringBuilder的使用..它的使用也很简单System.Text.StringBuilder sb = new System.Text.StringBuilder();这样就初始化了一个StringBuilder ..之后我们可以通过Append()来追加字符串填充到sb中..在你初始化一个StringBuilder 之后,它会自动申请一个默认的StringBuilder 容量(默认值是16),这个容量是由Capacity来控制的.并且允许,我们根据需要来控制Capacity的大小,也可以通过Length来获取或设置StringBuilder 的长度..
先来看Length的用法:
2sb.Append( "123456789" );//添加一个字符串
3sb.Length = 3;//设置容量为3
4Console.WriteLine( sb.ToString() );//这里输出:123
5
6sb.Length = 30;//重新设置容量为30
7Console.WriteLine( sb.ToString() + ",结尾");//这里在原来字符串后面补齐空格,至到Length的为30
8Console.WriteLine( sb.Length );//这里输出的长度为30
通过上面的代码,我们可以看出如果StringBuilder 中的字符长度小于Length的值,则StringBuilder 将会用空格硬填充StringBuilder ,以满足符合长度的设置..如果StringBuilder 中的字符长度大于Length的值,则StringBuilder 将会截取从第一位开始的Length个字符..而忽略超出的部分..
再来看看最重要的部分Carpacity的用法:
2Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
3Console.WriteLine( "\t Length:" + sb.Length );
4
5sb.Append( '1',17 );//添加一个字符串,这里故意添加17个字符,是为了看到Capacity是如何被扩充的
6Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
7Console.WriteLine( "\t Length:" + sb.Length );
8
9sb.Append( '2',32 );//添加一个字符串
10Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
11Console.WriteLine( "\t Length:" + sb.Length );
12
13sb.Append( '3',64 );//添加一个字符串
14Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
15Console.WriteLine( "\t Length:" + sb.Length );
16
17//注意这里:如果你取消Remove这步操作,将会引发ArgumentOutOfRangeException异常,因为当前容量小于
18
19//Length,这在自己控制StringBuilder的时候务必要注意容量溢出的问题
20
21sb.Remove(0,sb.Length);//移出全部内容,再测试
22sb.Capacity = 1;//重新定义了容量
23sb.Append( 'a',2 );
24Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
25Console.WriteLine( "\t Length:" + sb.Length );
26
27sb.Append( 'b',4 );
28Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
29Console.WriteLine( "\t Length:" + sb.Length );
30
31sb.Append( 'c',6 );
32Console.Write( "Capacity:" + sb.Capacity );//这里的Capacity会自动扩大
33Console.WriteLine( "\t Length:" + sb.Length
上面的代码输出的结果:
2Capacity:32 Length:17 //第二次,我们故意添加了17个字符,于是Capacity=Capacity*2
3Capacity:64 Length:49 //继续超出,则Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3 Length:2 //清空内容后,设置Capacity=1,重新添加了字符
6Capacity:7 Length:6 //后面的结果都类似
7Capacity:14 Length:12
从上面的代码和结果可以说明StringBuilder中容量Capacity是如何增加的:创建一个StringBuilder之后,默认的Capacity初始化为16,接着我们添加17个字符,以方便看到Capacity的扩充后的值..大家在修改Capacity的时候,一定要注意21行的注释,一定要确保Capacity >= Length,否则会引发ArgumentOutOfRangeException异常...看完结果,就可以推断出Capacity的公式:
if ( Capacity < Length && Capacity > 0 ){
Capacity *= 2;
}
OK..看到公式就明白了..StringBuilder是以当前的Capacity*2来扩充的..所以,在使用StringBuilder需要特别注意,尤其是要拼接或追加N多字符的时候,要注意技巧的使用,可以适当的,有预见性的设置Capacity的值,避免造成过大内存的浪费,节约无谓的内存空间..例如,下列代码就可以根据情况自动的扩展,而避免了较大的内存浪费.
2int i = 0;
3long StartTime = DateTime.Now.Ticks;
4while ( i < 100000 ) {
5sb.Append( i.ToString() );
6i++;
7}
8long EndTime = DateTime.Now.Ticks;
9
10Console.WriteLine( "时间:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb.Capacity + "\t Length:"
11
12+ sb.Length);
13
14System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
15i = 0;
16StartTime = DateTime.Now.Ticks;
17while ( i < 100000 )
18{
19if ( sb1.Capacity <= sb1.Length )//先判断是否>Length
20sb1.Capacity += 7;//这里一定要根据情况的增加容量,否则会有性能上的消耗
21sb1.Append( i.ToString() );
22i++;
23}
24EndTime = DateTime.Now.Ticks;
25
26Console.WriteLine( "时间:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb1.Capacity + "\t
27
28Length:" + sb1.Length);
需要特别说明的一点是,自动增加的容量,一定要根据实际预见的情况而改变,否则不但起不到优化的作用,反而会影响到程序的性能..
另外,如果有时间的话,可以测试一下下面的代码,用string和StringBuilder拼接字符串的区别..你会吓到的!!
2int i = 0;
3long StartTime = DateTime.Now.Ticks;
4while ( i < 100000 ) {
5sb.Append( i.ToString() );
6i++;
7}
8long EndTime = DateTime.Now.Ticks;
9
10Console.WriteLine( "时间:" + ( EndTime-StartTime ) );
11
12string sb1 = null;
13i = 0;
14StartTime = DateTime.Now.Ticks;
15while ( i < 100000 )
16{
17sb1 += i;
18i++;
19}
20EndTime = DateTime.Now.Ticks;
21Console.WriteLine( "时间:" + ( EndTime-StartTime ));
转载于:https://www.cnblogs.com/wzyexf/archive/2006/03/13/349207.html
StringBuilder的实现与技巧相关推荐
- 《博客园精华集---CLR/C#分册》
<博客园精华集---CLR/C#分册> 转:http://www.cnblogs.com/anytao/archive/2008/09/04/lovechina_bestclr_3rdfi ...
- 《博客园精华集---CLR/C#分册》第三轮筛选结果 转载
好文集锦 发布日期:2008.9.4 作者:Anytao 精华集CLR/C#分册,经过一段时间三轮筛选努力,终于有了一个初步结果.虽然这个过程历时较长,又因快乐奥运而放松了一段岁月,今天终于可以将第三 ...
- 《博客园精华集---CLR/C#分册》第三轮筛选结果
<博客园精华集---CLR/C#分册>第三轮筛选结果 发布日期:2008.9.4 作者:Anytao 精华集CLR/C#分册,经过一段时间三轮筛选努力,终于有了一个初步结果.虽然这个过程历 ...
- C#.Net分类随笔列表
也说C#中的Immutable fox23 2008-07-26 18:29 阅读:646 评论:8 谁动了我的构造函数? AndyHai 2008-07-26 16:18 阅读:643 评论:6 ...
- Java性能优化最易操作的10大技巧!
编辑 | ShirleyZ 译文 | 班纳睿 .一叶障目 .learner 原文 | https://coyee.com/article/11753-top-10-easy-performance- ...
- Java 性能调优的 11 个实用技巧
大多数开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识.好吧,不能说这是完全错误的.优化应用程序以获得最佳性能不是一件容易的事情.但是,这并不意味着如果你不具备这些知识,就不能做任何事情.这 ...
- C#设计技巧总结 网上转贴
C#设计技巧总结 做为一个程序员如何从细节上来提高我们的编程水平?下面几点,应该完全没有理由不掌握的: 1.编码习惯 对于一个团队开发来说,编码习惯是非常重要的,至少我们需要按照下面一些命名规范:类名 ...
- Java性能优化技巧
Java性能优化技巧 参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序 ...
- Java 性能优化的五大技巧
要对你的 Java 代码进行优化,需要理解 Java 不同要素之间的相互作用,以及它是如何与其运行时的操作系统进行交互的.使用下面这五个技巧和资源,开始学习如何分析和优化你的代码吧. 在我们开始之前, ...
最新文章
- c语言指针要点,C语言指针的重点有哪些?
- 用CSS在博客园底部加上蒲公英动态效果的实现方法
- Java基础知识回顾
- 【转】每天一个linux命令(44):top命令
- you think you know javascript
- springboot第十一讲
- 插入区间Python解法
- 机器学习之基于Fisher线性分类器实现多类人脸的识别
- micropython oled中文_micropython中怎么将gb2312编码的字节流变成中文
- 十道清肠素食,满满的都是膳食纤维!
- linux驱动编写(入门)
- ios开发笔记之 视频播放收藏
- nitc免费效益型企业网站php版 后台不能登陆,nitc免费效益型企业网站PHP版
- [WebGL入门]三十一,Quaternions(四元数)
- 办公计算机班半学期总结,计算机班的班主任工作总结.docx
- android倒计时日历软件,Hurry - 一款颜值超高的日历+倒计时 APP - Android 应用 - 纪念日 - 【最美应用】...
- SQL 函数 —— TRUNCATE详解示例
- 计算机 smb共享,文件大师SMB共享使用方法
- 【GPS】IGS数据下载
- 【新大陆物联网竞赛】mysql5.7连接navicat
热门文章
- 2020年, SGG论文汇总
- 集合 Subset Sums
- CCF OJ 1113-括号匹配[栈]
- [USACO1.1]坏掉的项链Broken Necklace
- [JOI2012春季合宿]Rotate (链表)
- python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)
- c语言主范式与编码,超详细!终于搞明白KMP算法
- 20200406 托普雷兹矩阵 Toeplitz
- html-head-body
- C#语言-07.文件操作