注:这篇文章基本是《C#高级编程》(第七版)第九章的学习笔记。

众所周知,C#中处理字符串通常用的都是string,它其实是.NET基础类System.String类的映射。注意一个是小写一个是大写。我觉得这种设计可能是为了在使用基础功能时让代码看起来就像在使用C风格的字符串。

String类功能强大,但是有一个问题:重复修改一个string实例,效率会很低。原因是,string对象在初始化之后就不可变了,修改string对象的方法实际上是创建新的实例。例如:

string greetingText = "First message, ";
greetingText += "Second message";

这段代码实际上做的事情是:首先,创建一个string对象,并将它初始化为文本"First message, "。然后在把对象的引用赋值给变量greetingText。第二句则创建了一个新的string对象,然后将其初始化为两个字符串连接的结果,最后将变量greetingText赋值为这个新对象的引用。这样一来,greetingText原来所引用的对象就没有被任何变量引用了,它将被垃圾收集机制销毁掉。

这种情况看起来还好,仅仅是多创建了一个对象而已。但考虑下面的情况:

把字符串中的每个字符都用其在字母表中的后一个字符来代替。

使用string的Replace方法最简单:

for (int i = 'z'; i >= 'a'; i--)
{
char old1 = (char)i;
char new1 = (char)(i+);
greetingText = greetingText.Replace(old1, new1);
}

简便起见,只写了转换小写字符的代码,也没有考虑字符'z'的情况。因此'z'会被替换为'{'。

问题来了:假如greetingText含有从'a'到'z'的所有字符,那么这段代码就需要创建26个新string对象。如果字符串较大而且调用频繁,就会出现性能问题。

System.Text.StringBuilder类就是为了解决这类问题。它能够高效工作,但是支持的方法较少。它包含的操作仅限于替换、追加或删除字符串。

可以推测,StringBuilder类对字符串的修改需要在分配给其实例的内存中操作。这样,追加和替换字符就很高效。但是删除和插入依然效率不高。

StringBuilder类有两个重要属性:

  • Length指定字符串的实际长度;
  • Capacity指定分配给字符串的内存的最大长度。

创建StringBuilder类时,可以指定Capacity(容量)的值(一般大于字符串的长度,默认值是16)。在处理时如果容量不够, StringBuilder会将容量翻倍。这个特点和C++中的容器很像。

同样写上面的程序:

StringBuilder greetingBuilder = new StringBuilder("First message, ", );
greetingBuilder.Append("Second message"); for (int i = 'z'; i >= 'a'; i--)
{
char old1 = (char)i;
char new1 = (char)(i+);
greetingBuilder = greetingBuilder.Replace(old1, new1);
}

注意StringBuilder的创建方法和追加字符串的方法都和string不同。注意构造函数的第二个参数容量设为了30。

这段代码只创建了一个StringBuilder对象。并且所有的操作都是在这个对象的内存块中进行的,所以效率很高。

——昨天碰到了一个极端的例子:把string类用StringBuilder类替换后,速度快了60多倍!这个程序是处理一个很长的字符串,对这个字符串的每个字符做循环,循环内执行string的追加操作。这就是StringBuilder类的典型应用场景。从前文可以知道,用string会非常慢。这个时候就一定要用StringBuilder类。

但注意:StringBuilder类不能总是提高性能。其应在处理多个字符串时使用。如果只是连接两个字符串等简单操作,使用String类较好。

另:不能把StringBuilder强制转换为String,只能用ToString()方法。

C#中的字符串——用Stringbuilder类很重要的更多相关文章

  1. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  2. 理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...

  3. shell中截取字符串的方法总结

    shell中截取字符串的方法有很多种, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...

  4. String/StringBuilder 类 统计字符串中字符出现的次数

    1.1. 训练描述:[方法.String类] 一.需求说明:定义如下字符串: String str = “javajfiewjavajfiowfjavagkljjava”; 二.请分别定义方法统计出: ...

  5. 数据结构和算法 – 4.字符串、 String 类和 StringBuilder 类

    4.1.String类的应用 class String类应用 { static void Main(string[] args) { string astring = "Now is The ...

  6. 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

    长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...

  7. java中String类、StringBuilder类和StringBuffer类详解

    本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html  版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...

  8. Android中五大字符串总结(String、StringBuffer、StringBuilder、Spanna

    https://www.aliyun.com/jiaocheng/2861.html?spm=5176.100033.1.35.2ed56b03CbsYFK 摘要:String.StringBuffe ...

  9. 总结 String、StringBuffer与StringBuilder类中常用的方法

    一.String类的常用方法 1.获取: 1)获取字符串str长度 int i = str.length(); 2)根据位置(index)获取字符 char c = str.charAt(index) ...

随机推荐

  1. [Docker] Build a Simple Node.js Web Server with Docker

    Learn how to build a simple Node.js web server with Docker. In this lesson, we'll create a Dockerfil ...

  2. 搭建hbase-0.94.26集群环境 分类: B7_HBASE 2015-01-24 17:14 861人阅读 评论(0) 收藏

    先安装hadoop1.2.1,见http://blog.csdn.net/jediael_lu/article/details/38926477 1.配置hbase-site.xml <prop ...

  3. js中json法创建对象(json里面的:相当于js里面的=)

    js中json法创建对象(json里面的:相当于js里面的=) 一.总结 json里面的:相当于js里面的= 4.json创建js对象解决命名冲突:多个人为同一个页面写js的话,命名冲突就有可能发生, ...

  4. 互联网支付的"二清"介绍

    所谓"二清"公司,是针对"一清"机构而言. 的"一清"和"二清"一般属于POS收单业务范畴,"一清" ...

  5. C#中使用split分割字符串的几种方法小结

    1.用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray= ...

  6. thinkphp中如何实现无限级分类?

    thinkphp中如何实现无限级分类? 一.总结 1.数据表设计+递归算法 二.php实现无限级分类实例总结 1.数据库数据如下: 2.任务需求:给一个id,求自己和所有父亲. 3.实现代码如下:th ...

  7. 小强的HTML5移动开发之路(28)—— JavaScript回顾3

    一.基本数据类型 number:数字类型 string:字符串 (注意s小写:string是基本类型) boolean:布尔类型   //前三个都有对应的包装类 null:空类型 undefined: ...

  8. 西方教育骗局,终于明白精英和普通人的残酷差别!(该校流传着一个数字——4。即“4小时睡眠、4杯咖啡、GPA4.0”——要想获得满分为4分的成绩,每天只睡4个小时,困了就喝4大杯咖啡)

    2018-02-14 00:00英国/私立学校 你不知道的是:西方教育通过一个宽松的过程,偷偷完成了社会分层. 1 “中国学生真是太苦了!”我的同学李女士总是发出这样的感慨. 李女士是我中学同学,在一 ...

  9. 关于iPhone开发的一些建议

    建议 以后的应用程序,都使用AutoLayout, 不要再用绝对定位CGReck. 使用类似网页的方式来设计界面. 设计师好,程序员也好,尽量使用点这个单位进行思考,而不要使用像素.比如,你需要做44 ...

  10. HDU1074 Doing Home Work - 状压dp

    传送门 题目大意: 有n(\(\le 15\))个作业,每个作业有个name, deadline(截止日期),cost(做作业花的时间),如果没有按时完成某个作业,惩罚分数为超出的时间,求一个合理的顺 ...