C#中的字符串——用Stringbuilder类很重要
注:这篇文章基本是《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类很重要的更多相关文章
- 重温java中的String,StringBuffer,StringBuilder类
不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...
- 理解Java中的字符串类型
1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...
- shell中截取字符串的方法总结
shell中截取字符串的方法有很多种, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...
- String/StringBuilder 类 统计字符串中字符出现的次数
1.1. 训练描述:[方法.String类] 一.需求说明:定义如下字符串: String str = “javajfiewjavajfiowfjavagkljjava”; 二.请分别定义方法统计出: ...
- 数据结构和算法 – 4.字符串、 String 类和 StringBuilder 类
4.1.String类的应用 class String类应用 { static void Main(string[] args) { string astring = "Now is The ...
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...
- java中String类、StringBuilder类和StringBuffer类详解
本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...
- Android中五大字符串总结(String、StringBuffer、StringBuilder、Spanna
https://www.aliyun.com/jiaocheng/2861.html?spm=5176.100033.1.35.2ed56b03CbsYFK 摘要:String.StringBuffe ...
- 总结 String、StringBuffer与StringBuilder类中常用的方法
一.String类的常用方法 1.获取: 1)获取字符串str长度 int i = str.length(); 2)根据位置(index)获取字符 char c = str.charAt(index) ...
随机推荐
- 【例题 6-5 UVA 12657 】Boxes in a Line
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 双向链表模拟题. 移动的时候,要注意它就在所需要的位置的情况.那种情况不移动. (如果已经在所需位置了,还用链表的插入方式强行移动的 ...
- MFC屏蔽 WindowS按键
LRESULT CALLBACK LowLevelKeyboardPorc(int nCode,WPARAM wParam,LPARAM lParam)//屏蔽按键的真正实现方法{ BOOL fEat ...
- iOS中OC给Category加入属性
引: 非常多人知道能够用Category给已有的类加入一些新方法,可是不同于swift中的extension,Objective-C中的Category(类别)是不支持直接加入属性的.那假设就是须要加 ...
- swift学习第二天:swift中的基本数据类型
一:swift基本数据类型 Swift中的数据类型也有:整型/浮点型/对象类型/结构体类型等等 先了解整型和浮点型 整型 有符号 Int8 : 有符号8位整型 Int16 : 有符号16位整型 Int ...
- html5-7 html5语义标签和视频
html5-7 html5语义标签和视频 一.总结 一句话总结:设计网站的时候要兼顾早期浏览器的话,最新技术要缓着用,自己可以先尝试. 1.html5所有标签共有属性有哪四种? 1.id2.clas ...
- 网络异常与SQL Server事务
SQL Server事务遭遇网络异常时的处理机制浅析 SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Se ...
- 微信小程序从零开始开发步骤(三)
上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...
- 具体分析contrex-A9的汇编代码__switch_to(进程切换)
//函数原型:版本号linux-3.0.8 struct task_struct *__switch_to(structtask_struct *, struct thread_info *, str ...
- 微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现
原文:微服务学习笔记(2)--使用Consul 实现 MagicOnion(GRpc) 服务注册和发现 1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载w ...
- Tor (洋葱头)torbrowser
Tor是什么 Tor是互联网上用于保护您隐私最有力的工具之一,但是时至今日仍有许多人往往认为Tor是一个终端加密工具.事实上,Tor是用来匿名浏览网页和邮件发送(并非是邮件内容加密)的.今天,我们要讨 ...