C#⾼效率创建字符串类(StringBuilder)
1、为什么需要StringBuilder类?
因为String类型代表不可变字符串,所以⽆法对当前String类型实例进⾏处理.所以FCL提供了System.Text.StringBuilder类型,它可以接受字符串和字符作为参数,并对其进⾏⾼效动态处理,最终返回String对象.so,你可以将StringBuilder想象成对String字符串进⾏各种骚操作的特殊的构造器.通过Copy On Write技术实现的可变字符串的代理类,关于Copy On Wirte请参考的案例⼆.
2、StringBuilder处理字符数组和字符串须知
(1)、StringBuilder对象实例包含⼀个字段,该字符引⽤了由Char字符构成的数组,可以⽤StringBuilder的各个成员来操作该字符串数组.
(2)、⾼效率地缩短字符串或更改字符串中的字符.
(3)、如果字符串变⼤,超过了事先分配的字符数组⼤⼩.StringBuilder会⾃动分配⼀个新的、更⼤的数组,复制字符.并开始使⽤新数组.前⼀个数组被垃圾回收.
(4)、当使⽤StringBuilder处理完⽬标字符串之后,可以调⽤StringBuilder的ToString⽅法即可将StringBuild
er的处理完的数组转换成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(15, '-');
Console.WriteLine(res2);
虽然⽀持,但是每次处理的都不是同⼀个字符串对象实例,使⽤StringBuilder就能解决这个问题,保证进⾏多次字符串操作的同时,还能确保操作的是同⼀个实例.
/
/设置当前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对象实例,会是新的对象实例
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[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();
4、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()+"$");
5、String类和StringBuilder类的差异
(1)、String类提供的⽅法多于StringBuilder类提供的⽅法,但是StringBuilder提供了更全⾯的Replace⽅法.所以StringBuilder⽆法向String类使⽤的那样灵活.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。