1.Length

 

0.说明

在上一篇进一步了解String 中,发现了string的不便之处,而string的替代解决方案就是StringBuilder的使用
它的使用也很简单
System.Text.StringBuilder sb =newSystem.Text.StringBuilder();
这样就初始化了一个StringBuilder,之后我们可以通过Append()来追加字符串填充到sb中
初始化StringBuilder 后,它会自动申请一个默认的StringBuilder 容量(默认值是16),
这个容量是由Capacity来控制的.并且允许,我们根据需要来控制Capacity的大小,也可以通过Length来获取或设置StringBuilder 的长度

1.Length的用法

System.Text.StringBuilder sb =newSystem.Text.StringBuilder();
sb.Append("");//添加一个字符串
sb.Length=;//设置容量为3
Console.WriteLine( sb.ToString());//这里输出:123
sb.Length=;//重新设置容量为30
Console.WriteLine( sb.ToString()+",结尾");//这里在原来字符串后面补齐空格,至到Length的为30
Console.WriteLine( sb.Length);//这里输出的长度为30
通过上面的代码,我们可以看出如果StringBuilder 中的字符长度小于Length的值,则StringBuilder 将会用空格硬填充StringBuilder ,以满足符合长度的设置
如果StringBuilder 中的字符长度大于Length的值,则StringBuilder 将会截取从第一位开始的Length个字符,而忽略超出的部分..
 

2.Capacity

 

1.代码

System.Text.StringBuilder sb =newSystem.Text.StringBuilder();//初始化一个StringBuilder
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length);
sb.Append('',);//添加一个字符串,这里故意添加17个字符,是为了看到Capacity是如何被扩充的
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length);
sb.Append('',);//添加一个字符串
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length);
sb.Append('',);//添加一个字符串
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length);
//注意这里:如果你取消Remove这步操作,将会引发ArgumentOutOfRangeException异常,因为当前容量小于
//Length,这在自己控制StringBuilder的时候务必要注意容量溢出的问题
sb.Remove(,sb.Length);//移出全部内容,再测试
sb.Capacity=;//重新定义了容量
sb.Append('a',);
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length);
sb.Append('b',);
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length);
sb.Append('c',);
Console.Write("Capacity:"+ sb.Capacity);//这里的Capacity会自动扩大
Console.WriteLine("\t Length:"+ sb.Length

2.输出结果

Capacity:16Length://输出第一次,默认的Capacity是16
Capacity:32Length://第二次,我们故意添加了17个字符,于是Capacity=Capacity*2
Capacity:64Length://继续超出,则Capacity=Capacity*2
Capacity:128Length:
Capacity:3Length://清空内容后,设置Capacity=1,重新添加了字符
Capacity:7Length://后面的结果都类似
Capacity:14Length:

3.说明

从上面的代码和结果可以说明StringBuilder中容量Capacity是如何增加的:
创建一个StringBuilder之后,默认的Capacity初始化为16,接着我们添加17个字符,以方便看到Capacity的扩充后的值
大家在修改Capacity的时候,一定要注意21行的注释,一定要确保Capacity >= Length,否则会引发ArgumentOutOfRangeException异常.
看完结果,就可以推断出Capacity的公式:

if ( Capacity < Length && Capacity >  ){
Capacity *= ;
}

OK..看到公式就明白了..StringBuilder是以当前的Capacity*2来扩充的

所以,在使用StringBuilder需要特别注意,尤其是要拼接或追加N多字符的时候,要注意技巧的使用
可以适当的,有预见性的设置Capacity的值,避免造成过大内存的浪费,节约无谓的内存空间
例如,下列代码就可以根据情况自动的扩展,而避免了较大的内存浪费.
System.Text.StringBuilder sb =newSystem.Text.StringBuilder();
int i =;
longStartTime=DateTime.Now.Ticks;
while( i <)
{
sb.Append( i.ToString());
i++;
}
longEndTime=DateTime.Now.Ticks;
Console.WriteLine("时间:"+(EndTime-StartTime)+"\t Capacity:"+ sb.Capacity+"\t Length:"
+ sb.Length);
System.Text.StringBuilder sb1 =newSystem.Text.StringBuilder();
i =;
StartTime=DateTime.Now.Ticks;
while( i <)
{
if( sb1.Capacity<= sb1.Length)//先判断是否>Length
{
sb1.Capacity+=;//这里一定要根据情况的增加容量,否则会有性能上的消耗
}
sb1.Append( i.ToString());
i++;
}
EndTime=DateTime.Now.Ticks;
Console.WriteLine("时间:"+(EndTime-StartTime)+"\t Capacity:"+ sb1.Capacity+"\t
Length:" + sb1.Length);
 
需要特别说明的一点是,自动增加的容量,一定要根据实际预见的情况而改变,否则不但起不到优化的作用,反而会影响到程序的性能..

3.StringBuilder.Append 与 string+的性能比较

 

0.说明

一旦你的string在堆中创建后,其在内存中都是以const存在,任何的修改都会使其被重新创建为新的string,而指向以前的string的引用将会指向这个新的string!!
即每次string+操作,总会创建新的string,使得此操作占用内存空间大,耗时长。

1.代码

System.Text.StringBuilder sb =newSystem.Text.StringBuilder();
int i =;
longStartTime=DateTime.Now.Ticks;
while( i <)
{
sb.Append( i.ToString());
i++;
}
longEndTime=DateTime.Now.Ticks;
Console.WriteLine("时间:"+(EndTime-StartTime));
string sb1 =null;
i =;
StartTime=DateTime.Now.Ticks;
while( i <)
{
sb1 += i;
i++;
}
EndTime=DateTime.Now.Ticks;
Console.WriteLine("时间:"+(EndTime-StartTime));
本人实测时间
StringBuilder时间:    119964
string+时间:             410746739

2.总结

连接少量字符串:使用string
连接大量字符串:使用StringBuilder并注意对Capacity的控制

StringBuilder的实现与技巧(转)的更多相关文章

  1. StringBuilder的实现与技巧ZZ

      在上一篇进一步了解String 中,发现了string的不便之处,而string的替代解决方案就是StringBuilder的使用..它的使用也很简单System.Text.StringBuild ...

  2. C#自学笔记总结

    一.变量:声明变量的语法:变量类型 变量名; 变量名=值;变量类型 变量名=值: 在使用变量的时候要注意:变量一定要先声明,再赋值,最后使用例子: 变量的特点:1.不能够被重复的声明2.可以被重复的赋 ...

  3. 聊聊c#字符串拼接

    字符串对我编程人员来说是字符串时每天见面的常客,你不认识不熟悉他都不得行,字符串的拼接更是家常便饭,那么在实际开发过程中实现字符串的拼接有哪一些方式呢?咱们一起来聊聊,来交流沟通,学习一波.也许你会说 ...

  4. java字符串拼接技巧(StringBuilder使用技巧)

    在平时的开发中,我们可能会遇到需要拼接如下格式的字符串(至少我是遇到了很多次): 1,2,3,4,5,6,7,8,9,10,11,12,12,12,12,34,234,2134,1234,1324,1 ...

  5. SQL开发技巧(二)

    本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...

  6. EF查询之性能优化技巧

    上一篇:EF使用CodeFirst方式生成数据库&技巧经验 前言 EF相信大部分同学都已经经常使用了,可是你的查询高效吗? 今天我就以个人使用经验来讲讲在使用EF做查询的时候大家都容易忽略的性 ...

  7. FineUI小技巧(7)多表头表格导出

    前言 之前我们曾写过一篇文章 FineUI小技巧(3)表格导出与文件下载,对于在 FineUI 中导出表格数据进行了详细描述.今天我们要更进一步,介绍下如何导出多表头表格. 多表头表格的标签定义 在 ...

  8. FineUI小技巧(1)简单的购物车页面

    起因 最初是一位 FineUI 网友对购物车功能的需求,需要根据产品单价和数量来计算所有选中商品的总价. 这个逻辑最好在前台使用JavaScript实现,如果把这个逻辑移动到后台C#实现,则会导致过多 ...

  9. C#WebBrowser控件使用教程与技巧收集--苏飞收集

    C#WebBrowser控件使用教程与技巧收集--苏飞收集 先来看看常用的方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System. ...

随机推荐

  1. JavaScript之父谈JavaScript

    本文翻译自popularity,为了更好的阅读我把部分内容进行了增删改,如果你英语比较好,建议直接阅读原文,因为这篇文章是我通过google翻译再进行修改的. 貌似(根据一位精神导师的说法)JavaS ...

  2. shell编程之环境变量配置文件(4)

    1 source命令 修改了配置文件,并让它立刻生效,而不用重新登录 source 配置文件 或者 .配置文件 2 环境变量配置文件简介 PATH HISTSIZE PS1 HOSTNAME等环境变量 ...

  3. UML设计

    UML设计 1. UML的概念 Unified Modeling Language(UML)又称统一建模语言或标准建模语言,是一个支持模型化和软件系统开发的图形化语言.为软件开发的所有阶段提供模型化和 ...

  4. yum安装man命令程序错误

    第一次安装CentOS后,man命令无法使用,查了一下,发现没有安装man命令程序.尝试安装man yum install man 结果如下: Loaded plugins: fastestmirro ...

  5. Python自动化--语言基础7--操作日志、加密、发送邮件、线程、生产者消费者

    1.操作日志 logging.basicConfig:日志的统一处理器,对日志的输出格式和方式做配置日志级别等级CRITICAL > ERROR > WARNING > INFO & ...

  6. C# 使用AngleSharp 爬虫图片

    AngleSharp 简介 AngleSharp是基于.NET(C#)开发的专门解析HTML源码的DLL组件.根据HTML的DOM结构操作HTML,整个DOM已传输到逻辑类结构中.这种结构可以更好的操 ...

  7. [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比

    <<返回目录 平均值 vs 百分比 在考虑要性能测试的目标值时,我们需要考虑用什么统计口径.大多数人都会首选平均值,但在大多数情况下,这个正确的,但你也应该适当的考虑百分数.但你有可用性的 ...

  8. solr6.6教程-从mysql数据库中导入数据(三)

    整理多半天的solr6.6,终于算是把solr6.6中配置数据库弄出来了,网上的文章千篇一律,各说个的,没有一篇统一覆盖solr6.6版本配置的 帖子,本章节我会把配置的一些注意事项一一列举,由于时间 ...

  9. mac清除某个端口的占用

    lsof -i:8080查找某个应用的pid kill  pid就可以了

  10. crontab定时任务(centos)

    cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbi ...