字符串的不可变性--转载
字符串
(1).字符串的不可变性
因为字符串具有不可以变性,当我们给一个字符串变量,重新赋值的时候,
字符串原来的值还存在于堆中,只是栈中的指向地址改变了.
这个时候,有一个问题,如果我们需要对一个字符串进行大量的赋值操作,
这样的话内存中就会存在很多无用的垃圾.
当程序结束的时候,GC扫描整个内存,如果发现空间没有被指向.就会销毁这个
空间.
2自动优化功能:


(2).我们可以将字符串看做是char类型的一个只读数组.
namespace _07.字符串的第二个特性{class Program{static void Main(string[] args){//可以将string类型看成char类型的一个只读数组string s = "abcdefg";//既然可以将string看做char类型的只读数组,所以我们可以通过下标去访问字符串中的某一个元素char c1 = s[0];Console.WriteLine(c1); //获得了a//s[0] = 'b'; 不能这样做因为是只读的//如果我们非要改变第一个元素的值为'b'怎么办呢?//首先我们要将字符串转换成char数组char[] c2 = new char[s.Length];for (int i = 0; i < s.Length; i++){c2[i] = s[i];}//然后我们再修改第一个元素c2[0] = 'b';//最后我们在将这个字符数组转换成字符串//string s2 = ""; 频繁的给一个字符串变量赋值由于字符串的不可变性,会产生大量的内存垃圾StringBuilder s2=new StringBuilder(); //使用StringBuilder频繁的接受赋值就不会产生垃圾for (int i = 0; i < c2.Length; i++){s2.Append(c2[i]);}string s3 = s2.ToString(); //最后再转换成string类型Console.WriteLine(s3);
//当然也可以用ToCharArray()方法转换
// char[] chs = s.ToCharArray();
//Console.ReadLine(chs);
Console.ReadKey();}}}

StringBuilder类的作用
使用StringBuilder类,产生的对象,进行不停的赋值就不会产生很多的内存垃圾,
提成了运行效率
验证:
在不使用stringBuilder的情况下:
namespace _08.StringBuilder的使用{class Program{static void Main(string[] args){string str = null;Stopwatch sw = new Stopwatch(); //用来测试代码执行的时间sw.Start(); //开始计时for (int i = 0; i < 100000; i++){str += i;}sw.Stop();Console.WriteLine(str);Console.WriteLine(sw.Elapsed); //获取代码运行的时间Console.ReadKey();}}}
耗费时间:
大约有14秒我们现在使用StringBulider来验证:
namespace _08.StringBuilder的使用{class Program{static void Main(string[] args){string str = null;StringBuilder sb = new StringBuilder();Stopwatch sw = new Stopwatch(); //用来测试代码执行的时间sw.Start(); //开始计时for (int i = 0; i < 100000; i++){sb.Append(i);}sw.Stop();str = sb.ToString();Console.WriteLine(str);Console.WriteLine(sw.Elapsed); //获取代码运行的时间Console.ReadKey();}}}
消耗时间:
仅仅使用了0.1毫秒

树立目标,保持活力,gogogo!

浙公网安备 33010602011771号