C#_基础_String和StringBuilder及字符串常用方法(十五)

第一、字符串不可变性

 

  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'); //从第几开始找

 

posted @ 2018-06-12 10:48  CeasarH  阅读(311)  评论(0编辑  收藏  举报