一、为何须要StringBuilder类?html
由于String类型表明不可变字符串,因此没法对当前String类型实例进行处理.因此FCL提供了System.Text.StringBuilder类型,它能够接受字符串和字符做为参数,并对其进行高效动态处理,最终返回String对象.so,你能够将StringBuilder想象成对String字符串进行各类骚操做的特殊的构造器.经过Copy On Write技术实现的可变字符串的代理类,关于Copy On Wirte请参考Proxy代理模式(结构型模式)的案例二.数组
二、StringBuilder处理字符数组和字符串须知ide
(1)、StringBuilder对象实例包含一个字段,该字符引用了由Char字符构成的数组,能够用StringBuilder的各个成员来操做该字符串数组.函数
(2)、高效率地缩短字符串或更改字符串中的字符.post
(3)、若是字符串变大,超过了事先分配的字符数组大小.StringBuilder会自动分配一个新的、更大的数组,复制字符.并开始使用新数组.前一个数组被垃圾回收.ui
(4)、当使用StringBuilder处理完目标字符串以后,能够调用StringBuilder的ToString方法便可将StringBuilder的处理完的数组转换成String.这样就会在堆上新建String对象.以后能够继续处理StringBuidler中的字符串.之后可再次调用ToString把它转换成另外一个字符串。url
常规的对字符串进行屡次处理:spa
string str = " Hello World"; //对string进行Trim()一去字符操做 //执行过程以下: //一、先从字符串的开头开始处理,第一个是空格,检索传入的参数中是否有空格,有的话清除(若是第一个是连续的空字符,那么全部的空格都清除) //若是第一个被清除掉了,那么继续下一个字母H,和上面同样的流程.若是没有被清除掉,那么不在处理开头,转去清楚末尾的字母 //二、当开头的字母处理完毕,接着开始处理末尾的,流程和开头的一致 var res = str.Trim(' ', 'H','o'); //输出:$ello World$ Console.WriteLine('$'+res+'$'); //能够对上一步的处理结果进行处理,可是每次处理的都不是同一个实例 var res1 = res.Replace('o', 'a'); Console.WriteLine(res1); //能够对上一步的处理结果进行处理,可是每次处理的都不是同一个实例 var res2 = res1.PadLeft(15, '-'); Console.WriteLine(res2);
虽然支持,可是每次处理的都不是同一个字符串对象实例,使用StringBuilder就能解决这个问题,保证进行屡次字符串操做的同时,还能确保操做的是同一个实例.3d
//设置当前StringBuilder的初始大小为1,最大长度为2. //若是设置了最大值,那么超过最大值会抛异常,若是没有设置最大值 //超过初始值,长度会自动扩大两倍 StringBuilder sb = new StringBuilder(15,20); sb.Append(" Hello World"); sb.Replace('o', 'a'); Console.WriteLine(sb.ToString()); //输出完上面的处理结果以后,你能够继续对原有的StringBuilder对象进行操做. sb.AppendFormat("{0}",1); Console.WriteLine(sb.ToString()); //注:全部的操做,操做的都是同一个对象,可能扩展事后的StringBuilder对象实例,会是新的对象实例
三、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[0]); //修改sb实例的索引为0处的值为A sb[0] = 'A'; //输出:Aello World Console.WriteLine(sb.ToString()); //确保sb的长度为66,若是没有,自动扩大到66 sb.EnsureCapacity(66); //输出: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(66); //输出:False 由于Capacity不一样 Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2)); StringBuilder sb3 = new StringBuilder("Hello World"); //注:目标字符串不能有值,它不能像string的copyTo方法同样去覆盖原有的值,复制过去的字符串长度也不能超过目标字符串数组的长度 var destination = new char[6]; sb3.CopyTo(0, destination, 0, 2); //输出:He Console.WriteLine(destination); //注:全部的操做,操做的都是同一个对象,可能扩展事后的StringBuilder对象实例,会是新的对象实例 Console.ReadKey();
四、StringBuilder支持链式操做
由于StringBuidler的大多数方法返回一个StringBuilder引用,因此支持链式操做,代码以下:
//设置当前StringBuilder的初始大小为1,最大长度为2. //若是设置了最大值,那么超过最大值会抛异常,若是没有设置最大值 //超过初始值,长度会自动扩大两倍 StringBuilder sb = new StringBuilder("Hell World"); sb.Insert(4, 'o').Replace('o', 'a').Remove(5, sb.Length - 5); Console.WriteLine("$"+ sb.ToString()+"$");
五、String类和StringBuilder类的差别
(1)、String类提供的方法多于StringBuilder类提供的方法,可是StringBuilder提供了更全面的Replace方法.因此StringBuilder没法向String类使用的那样灵活.