C# 高效率创建字符串类(StringBuilder)
1、为什么需要StringBuilder类?
因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型,它可以接受字符串和字符作为参数,并对其进行高效动态处理,最终返回String对象.so,你可以将StringBuilder想象成对String字符串进行各种骚操作的特殊的构造器.通过Copy On Write技术实现的可变字符串的代理类,关于Copy On Wirte请参考Proxy代理模式(结构型模式)的案例二.
2、StringBuilder处理字符数组和字符串须知
(1)、StringBuilder对象实例包含一个字段,该字符引用了由Char字符构成的数组,可以用StringBuilder的各个成员来操作该字符串数组.
(2)、高效率地缩短字符串或更改字符串中的字符.
(3)、如果字符串变大,超过了事先分配的字符数组大小.StringBuilder会自动分配一个新的、更大的数组,复制字符.并开始使用新数组.前一个数组被垃圾回收.
(4)、当使用StringBuilder处理完目标字符串之后,可以调用StringBuilder的ToString方法即可将StringBuilder的处理完的数组转换成String.这样就会在堆上新建String对象.之后可以继续处理StringBuidler中的字符串.以后可再次调用ToString把它转换成另一个字符串。
常规的对字符串进行多次处理:
string str = " Hello World";
//对string进行Trim()一去字符操作
//执行过程如下:
//1、先从字符串的开头开始处理,第一个是空格,检索传入的参数中是否有空格,有的话清除(如果第一个是连续的空字符,那么所有的空格都清除)
//如果第一个被清除掉了,那么继续下一个字母H,和上面一样的流程.如果没有被清除掉,那么不在处理开头,转去清楚末尾的字母
//2、当开头的字母处理完毕,接着开始处理末尾的,流程和开头的一致
var res = str.Trim(' ', 'H','o');
//输出:$ello World$
Console.WriteLine('$'+res+'$');
//可以对上一步的处理结果进行处理,但是每次处理的都不是同一个实例
var res1 = res.Replace('o', 'a');
Console.WriteLine(res1);
//可以对上一步的处理结果进行处理,但是每次处理的都不是同一个实例
var res2 = res1.PadLeft(, '-');
Console.WriteLine(res2);

虽然支持,但是每次处理的都不是同一个字符串对象实例,使用StringBuilder就能解决这个问题,保证进行多次字符串操作的同时,还能确保操作的是同一个实例.
//设置当前StringBuilder的初始大小为1,最大长度为2.
//如果设置了最大值,那么超过最大值会抛异常,如果没有设置最大值
//超过初始值,长度会自动扩大两倍
StringBuilder sb = new StringBuilder(,);
sb.Append(" Hello World");
sb.Replace('o', 'a');
Console.WriteLine(sb.ToString());
//输出完上面的处理结果之后,你可以继续对原有的StringBuilder对象进行操作.
sb.AppendFormat("{0}",);
Console.WriteLine(sb.ToString());
//注:所有的操作,操作的都是同一个对象,可能扩展过后的StringBuilder对象实例,会是新的对象实例
3、StringBuilder的基本知识点
(1)、StringBuilder不是基元类型,是引用类型,所以需要使用new来创建对象实例
(2)、StringBuilder类提供了6个构造器,里面的关键参数有以下几个
capacity一设置StringBuilder初始大小默认长度为16.
maxCapacity一设置StringBuider的最大容量,默认值为2147483647
value一字符串(字符串数组)
介绍一个不常用,但是有用的构造函数.
public StringBuilder(string value, int startIndex, int length, int capacity);
给定一个字符串数组,然后通过startIndex和length截取其中的一段字符串作为字符数组,实例化一个StringBuilder对象.
下面是StringBuilder常用的一些不好记的操作:
//设置当前StringBuilder的初始大小为1,最大长度为2.
//如果设置了最大值,那么超过最大值会抛异常,如果没有设置最大值
//超过初始值,长度会自动扩大两倍
StringBuilder sb = new StringBuilder();
//输出:0 这个长度是当前sb实例中字符串的长度,是字符串的实际长度
Console.WriteLine(sb.Length);
//输出:16,默认长度为16,这个长度是当前sb的总长度
Console.WriteLine(sb.Capacity);
//输出StringBuilder的最大值.默认最大值为21亿
Console.WriteLine(sb.MaxCapacity);
//通过数组的方式给sb中的字符串实例设置值,但是此时没有初始化值,所以程序报错
//sb[0] = 'A';
sb.Append("Hello World");
//输出:H
Console.WriteLine(sb[]);
//修改sb实例的索引为0处的值为A
sb[] = 'A';
//输出:Aello World
Console.WriteLine(sb.ToString());
//确保sb的长度为66,如果没有,自动扩大到66
sb.EnsureCapacity();
//输出:66
Console.WriteLine(sb.Capacity); StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
//输出:True 因为两个StringBuilder实例中的字符串值相等,Capacity也相等
Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2));
//改变Capacity
sb1.EnsureCapacity();
//输出:False 因为Capacity不同
Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2));
StringBuilder sb3 = new StringBuilder("Hello World");
//注:目标字符串不能有值,它不能像string的copyTo方法一样去覆盖原有的值,复制过去的字符串长度也不能超过目标字符串数组的长度
var destination = new char[];
sb3.CopyTo(, destination, , );
//输出:He
Console.WriteLine(destination);
//注:所有的操作,操作的都是同一个对象,可能扩展过后的StringBuilder对象实例,会是新的对象实例
Console.ReadKey();

4、StringBuilder支持链式操作
因为StringBuidler的大多数方法返回一个StringBuilder引用,所以支持链式操作,代码如下:
//设置当前StringBuilder的初始大小为1,最大长度为2.
//如果设置了最大值,那么超过最大值会抛异常,如果没有设置最大值
//超过初始值,长度会自动扩大两倍
StringBuilder sb = new StringBuilder("Hell World");
sb.Insert(, 'o').Replace('o', 'a').Remove(, sb.Length - );
Console.WriteLine("$"+ sb.ToString()+"$");

5、String类和StringBuilder类的差异
(1)、String类提供的方法多于StringBuilder类提供的方法,但是StringBuilder提供了更全面的Replace方法.所以StringBuilder无法向String类使用的那样灵活.
C# 高效率创建字符串类(StringBuilder)的更多相关文章
- 可变字符串类 StringBuilder
string类创建的字符串是不可变的(同一内存中),每更改一次,就会新开辟内存,不利于高效频繁操作. 当频繁操作同一字符串变量时,建议使用StringBuilder. 可变字符串类StringBuil ...
- C#中的字符串——用Stringbuilder类很重要
注:这篇文章基本是<C#高级编程>(第七版)第九章的学习笔记. 众所周知,C#中处理字符串通常用的都是string,它其实是.NET基础类System.String类的映射.注意一个是小写 ...
- silverlight依据json字符串动态创建实体类
1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json); ...
- Core Java 总结(字符和字符串类问题)
所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 字符,字符串类问题 正则表达式问题 J ...
- 深入理解Java常用类-----StringBuilder
上篇文章我们介绍过String这个常用类,知道了该类的内部其实是用的一个char数组表示一个字符串对象的,只是该字符数组被final修饰,一旦初始化就不能修改,但是对于经常做字符串修改操作的情况下,S ...
- Java String:重要到别人只能当老二的字符串类
字符串,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思.你比如 ...
- Java中各种集合(字符串类)的线程安全性!!!
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
- Java String 字符串类细节探秘
一. 字符串基本知识要点 字符串类型String是Java中最常用的引用类型.我们在使用Java字符串的时候,通常会采用两种初始化的方式:1. String str = "Hello Wor ...
- [19/03/15-星期五] 常用类_String类&StringBuilder和StringBuffer类
一.基本概念 String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”. 那什么叫做“不可变对象”呢? 指的是对象内部的成员变量的值无法再改变.Str ...
随机推荐
- vba中布尔类型、字符串操作
在vba中,bool类型数据可以参与数学运算,true为-1,false为0 Sub mysub() Dim mybool As Boolean Debug.Print Debug.Print myb ...
- HDU 1079 Calendar Game (博弈或暴搜)
题意:给定一个日期,然后 A 和 B 双方进行操作,谁先把日期变成2001年11月04日,将获胜,如果超过该日期,则输了,就两种操作. 第一种:变成下一天,比如现在是2001.11.3 变成 2001 ...
- Netty4.x 源码实战系列(一): 深入理解ServerBootstrap 与 Bootstrap
转载自:https://www.cnblogs.com/itdriver/p/8149913.html 从Java1.4开始, Java引入了non-blocking IO,简称NIO.NIO与传统s ...
- celery 4.1下报kombu.exceptions.EncodeError: Object of type 'bytes' is not JSON serializable 处理方式
#python代码如下 from celery import Celeryimport subprocess app = Celery('tasks', broker='redis://localho ...
- ajax 简单实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> ...
- (转)ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器
上传文件有两个主要的目的地,一个是服务器,另一个是数据库,ASP.NET内置了FileUpload这个上传控件,文本框显示用户选择的文件的全名. 其属性主要包括: ContenLength:上传文件大 ...
- 在aliyun遇到一些问题
1. 删除现有网站报错:“applicationhost.config 错误 无法写入配置文件” 解决办法:用管理员身份打开IIS. 2. IIS上部署MVC网站,打开后500错误:处理程序“Exte ...
- [violet2]sillyz
题意:定义S(n) = n*各数位之积,然后给定L<=R<=10^18,求有多少个n在[L,R]区间内 思路: 看了半天无从下手..看完题解才豁然开朗.. 具体思路看vani神博客吧.讲的 ...
- 创建Pods私有库
Pods私有库创建步骤 创建私有 Spec Repo 创建Pod项目工程文件 创建podspec文件 本地测试podsspec文件 向Spec Repo提交podspec Pod库使用 更新维护pos ...
- 团队项目(HCL)
一.团队展示 队名:盐酸队 队员学号及风采: 团队项目描述:经典90坦克大战(基于java) 团队合照: 二.团队选题 经典90坦克大战是以坦克为题材的射击类小游戏,我们将在java上实现并拓展,我们 ...