无论是Java还C#或者其他语言 对于string变量应该都是非常熟悉的了 他是一个引用类型
因为他的不可以变性 并不是在原有的内存中添加数据 而是在堆中重新的开辟空间 这就导致处理大量数据时效率低下
口说无凭,咱们测试一下
测试:
String:
往str里添加10万个数字
Stopwatch s = new Stopwatch();//软件运行计时器 string str = ""; s.Start();//开始计时器 for (int i = 0; i <= 100000; i++) { str += i; } Console.WriteLine("完成"+s.Elapsed);
结果:
用时11秒
StringBuilder:
Stopwatch s = new Stopwatch();//软件运行计时器 StringBuilder sb = new StringBuilder(); s.Start();//开始计时器 for (int i = 0; i <= 100000; i++) { sb.Append(i); } Console.WriteLine("完成"+s.Elapsed); Console.Read();
结果:
哦,瞧瞧这巨大的差距
所以说如果处理大量的字符数据还是 使用StringBuilder好 效率非常nice
为什么两个区别那么大?
首先看看两者的内存分配
String:
还是以上面为例,
由于字符串的不可变性并不是在原来的内存上添加数据,而是在堆里开辟新的空间在把原来数据复制一遍,原来的内存就给GC(垃圾回收),这里就耗费大量的时间和资源
StringBuilder:
StringBuilder就不一样了 他是直接在原有的字符上添加数据 这就导致他们差距比较大的原因 使用大量的动态数据还是使用StringBuilder效率高
StringBuilder的创建:
StringBuilder并不能直接 string s =“小马哥哥”;
而是通过new出来的 也是一个引用类型
StringBuilder sb =new StringBuilder (“小马哥哥”);
初始值为 小马哥哥
StringBuilder sb =new StringBuilder (“小马哥哥”,200);
初始值为 小马哥哥 并且申请了 200个字符的空间 如超过200字符 就会自动申请2倍空间
当然也可以不用初始值
StringBuilder sb =new StringBuilder ();
或
StringBuilder sb =newStringBuilder (300);
提前申请300个字符空间
StringBuilder的方法:
创建好后需要往里面,添加数据,他并不能和string一样直接赋值,而是通过 Append() 方法进行添加
添加字符串:
StringBuilder sb = new StringBuilder(); sb.Append("小马哥哥");
和集合的添加方法一样
插入字符:
StringBuilder sb = new StringBuilder("小马哥哥"); sb.Insert(0,"哈哈哈");
在0前面插入 哈哈哈 0表示的是下标 也就是 小 字前面
输出结果为:哈哈哈小马哥哥
删除字符:
StringBuilder sb = new StringBuilder("小马哥哥"); sb.Remove(0,1);
从0开始删除 一直到 1 字符是从0开始的
输出结果为:马哥哥
删除所有字符:
StringBuilder sb = new StringBuilder("小马哥哥"); sb.Clear();
替换字符:
StringBuilder sb = new StringBuilder("小马哥哥"); sb.Replace("小","大") ; //sb.Replace('1','2') ;
小 字替换成 大 如不存在该字符也不会异常 当然也可以是char类型的
输出结果为:大马哥哥
最后总结一下:
如果要操作字符并且内容是一直发生改变的 就使用 StringBuilder因为他是可变的和String不同 他是不可变的
StringBuilder处理动态字符效率比string 高大几倍 操作也非常nice
纯手打,点个赞呗~