String:表示不可变字符串;每当在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间,而且在进行字符串连接的时候是新建一个字符串,进行连接后,最后赋值,如果对String赋值多次,就会在内存中保存多个这个对象的副本,浪费系统资源。
StringBuilder:表示可变字符串;不用生成中间对象,拼接字符串比较多,或字符串的长度比较长时有较高的效率。StringBuilder的内存空间不够也要扩容而且翻倍,在分配空间时,不要过大,过大就会浪费浪费资源。 所以,初始化StringBuilder的时候最好根据需要设置容量,避免浪费
String和StringBuilder使用时对占用的内存情况:
如:
1.string a="aa"+"bb";
2.stringbuilder sb=new stringbuilder();
sb.append("aa"); sb.append("bb");
区别在于:
1. string s = "";
for (int i=0;i<1000;i++)
s+=i.ToString();
2. StringBuilder sb = new StringBuilder(3000);//预先分配3000个字符,避免出现容量不足,新建string实例
for (int i=0;i<1000;i++)
sb.Append(i.ToString());
第一种一共出现了: ""(由s = ""产生的程序集共享的string实例) "0","1"..."999"(1000个由i.ToString产生) "0","01"..."01...998999"(1000个由+=产生) 总共2001个字符串实例
第二种一共出现了: "0","1"..."999"(1000个由i.ToString产生) 一个stringbuilder引用的字符串,总共1001个字符串实例
StringBuilder的方法与使用:
1.StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
如:
StringBuilder Sb = new StringBuilder("ABC!");
Sb.Append(" DEF");
Console.WriteLine(Sb); 结果是:ABCDEF
2.StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符,而且实现了 IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串并且追加到结尾
如:格式化货币值格式类型
int MyInt = 25;
StringBuilder SB = new StringBuilder("Your total is ");
SB.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(SB);结果是:Your total is $25.00
3.StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处,索引从0开始
如:
StringBuilder SB = new StringBuilder("ABCDEF");
SB.Insert(2,"HHH ");
Console.WriteLine(SB);结果是:ABHHHCDEF
4.StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符,索引从0开始
如: StringBuilder SB = new StringBuilder("ABCDEF");
SB.Remove(2,4); Console.WriteLine(SB);结果是:AB
5.StringBuilder.Replace 替换指定索引处的指定字符。
如: StringBuilder SB = new StringBuilder("ABCDEF");
SB.Replace(A,H);
Console.WriteLine(SB);结果是:HBCDEF