第一、字符串不可变性
1)当一个字符串重新赋值后,旧值并没有被销毁,而是重新开一块空间存放新值变量存储的新值内存地址
2)当程序结束后,GC扫描整个内存,如果发现有的内存空间没有被指向,则立即把它销毁
1 string s = "张三"; // 2 //重新赋值字符串,字符串“张三”没有销毁,又新开了一个空间复制 3 //引用s存的地址发生改变 4 s = "李四";
1 //输出内存地址方法对比 2 string s = "123"; 3 GCHandle h = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection); 4 IntPtr addr = GCHandle.ToIntPtr(h); 5 Console.WriteLine("ox" + addr.ToString("X")); 6 s = "abc"; 7 GCHandle h2 = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection); 8 IntPtr addr2 = GCHandle.ToIntPtr(h2); 9 Console.WriteLine("ox" + addr2.ToString("X"));
第二:相同的字符串,在堆中开辟一个空间,
例如 string s1 = “张三”;string s2 = “张三”;
s1 和 s2执行堆内存中同一个内存
通过Debug 模式下,调试 ---窗口 ---- 内存 ---- 内存1 /内存2/ 内存3 /内存4 查看变量的存放的地址
第三、字符串可看作是char类型的字符自读数组;可以通过索引访问字符串中的元素,但是不能修改
1 string s = "123abcd"; 2 //字符串可以看作是字符数组来获取元素 3 char c = s[0]; 4 for (int i = 0; i < s.Length; i++) 5 { 6 Console.WriteLine(s[i]); 7 }
第四、字符串可以转换为字符数组;字符数组也可以转换为字符串
1 string s = "123abcd"; 2 //字符串转换为字符数组 3 char[] ArrCh = s.ToCharArray(); 4 //字符数组转换为字符串 5 s = ArrCh.ToString();
第五、stringbuilder:作用字符串拼接,对字符串操作是同一块内存,而string需要不停的创建新空间,所以效率要比字符串效率高
1 //对比测试string 和 StringBuilder的效率 2 StringBuilder sb = new StringBuilder(); 3 //创建一个计时器,用来记录程序运行时间 4 Stopwatch sw = new Stopwatch(); //alt shift F10 添加命名空间 5 sw.Start(); 6 for (int i = 0; i < 1000000; i++) 7 { 8 sb.Append(i); 9 } 10 sw.Stop(); 11 Console.WriteLine(sw.Elapsed); //输出当前总运行时间 12 13 string str = null; 14 15 //创建一个计时器,用来记录程序运行时间 16 Stopwatch sw2 = new Stopwatch(); //alt shift F10 添加命名空间 17 sw2.Start(); 18 for (int i = 0; i < 1000000; i++) 19 { 20 str += i; 21 22 } 23 sw2.Stop(); 24 Console.WriteLine(sw2.Elapsed); //输出当前总运行时间
第六、字符串截取
1 //字符串截取 :字符截取 2 string str = "123a1sd"; 3 string[] arrStr = str.Split('a'); 4 5 foreach (var item in arrStr) 6 { 7 Console.WriteLine(item); 8 }
1 //字符串截取 :字符数组 2 string str = "123a1sd"; 3 char[]arr = {'2','a','b'}; 4 // string[] arrStr = str.Split(arr);//被截取的字符用空字符代替 5 string[] arrStr = str.Split(arr,StringSplitOptions.RemoveEmptyEntries);//移除掉截取的空格
第七、字符串常用方法
1 string str = "123a1sd"; 2 str = str.ToUpper();//把字符串转换为大写 3 str = str.ToLower(); //字符串转为小写 4 5 bool b1 = str.Equals("abc"); 6 bool b2 = str.Equals("abc", StringComparison.OrdinalIgnoreCase); //忽略大小写 7 8 bool b3 = str.StartsWith("12");//以什么开头结尾 9 bool b4 = str.EndsWith("12"); 10 11 str.Trim();//移除全部的空字符 12 str = str.TrimStart();//移除开始的空格 13 str = str.TrimEnd(); 14 15 bool b5 = string.IsNullOrEmpty(str);//是否是空或null 16 bool b6 = string.IsNullOrWhiteSpace(str);//是否是 null 空 空格 17 18 //插入 19 string[] tang = { "孙悟空", "猪八戒", "沙和尚", "白龙马" }; 20 // str = string.Join("厉害","素无卡","孙悟空"); //输出: 素无卡厉害孙悟空 21 str = string.Join("厉害", "孙悟空");//输出:孙悟空 ,因为出入两个元素中间只有一个元素不会插入 22 str = string.Join("厉害", tang); //输出:孙悟空厉害猪八戒厉害白龙马 23 Console.WriteLine(str);
int d = str.IndexOf('a'); //得到a在str中索引位置
d = str.IndexOf('a'); //从第几开始找