11字符串
字符串
1)、字符串的不可变性
当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值。
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁。
图示如下:
所以,当多个string类型的变量的值一样时,他们在堆中其实是共用一个空间的值的。
图示如下两图:
2)、我们可以讲字符串看做是char类型的一个只读数组。
ToCharArray();将字符串转换为char数组
new string(char[] chs):能够将char数组转换为字符串
比如:
//可以将string看作是一个char类型只读类型的数组
string s = "abcdefg";
//s[0] = "b";//不能这样做,因为他是只读的
//首先将字符串转换为char类型的数组
char[] chs = s.ToCharArray();
//然后再修改第一个
chs[0] = 'b';
//最后创建一个string对象,将他给s
s = new string(chs);
Console.WriteLine(s);
//也可以通过下标输出里面字符串里的某一个值
Console.WriteLine(s[0]);
StringBuilder
当要大量操作字符串时,用字符串对象效率比直接拼接字符串效率高,用为每次拼接 字符串都是在堆中重新开一块空间,而字符串对象则是一直使用一块空间
测试string和StringBuilder的效率
////当要大量操作字符串时,用字符串对象效率比直接拼接字符串效率高,用为每次拼接 字符串都是在堆中重新开一块空间,而字符串对象则是一直使用一块空间
StringBuilder sb = new StringBuilder();
string str = null;
//创建计时器对象
Stopwatch sw = new Stopwatch();
//调用开始计时的方法
sw.Start();
for (int i = 0; i < 100000; i++)
{
//str += i;//用时00:00:10.1407187
sb.Append(i);//用时 00:00:00.0035004
}
//循环完后结束
sw.Stop();
//输出用时
Console.WriteLine(sw.Elapsed);
字符串提供的各种方法
1)、Length:获得当前字符串中字符的个数
2)、ToUpper():将字符转换成大写形式
3)、ToLower():将字符串转换成小写形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
5)、Split():分割字符串,返回字符串类型的数组。
比如:
string s = "a b cd_ +,==e f";
//用char类型的数组进行分割
char[] chs = { ' ', '_', '+', '=', ',' };
string[]str = s.Split(chs, StringSplitOptions.RemoveEmptyEntries); //StringSplitOptions.RemoveEmptyEntries移除用于替换分割后的空格
6)、Substring():解决字符串。在截取的时候包含要截取的那个位置。
string str = "今天天气好晴朗,处处好风光";
str = str.Substring(1, 2);//包括开始位,只写一个参数表示截取到最后
Console.WriteLine(str);
7)、IndexOf():判断某个字符串在字符串中第一次出现的位置,如果没有返回-1、值类型和引用类型在内存上存储的地方不一样。
string str = "今天天气好晴朗,处处好风光";
int index = str.IndexOf('天', 3);//第二个参数表示起始位置,查找的时候就从起始位置开始找,没找到返回-1
Console.WriteLine(index);
8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有同样返回-1
string str = "今天天气好晴朗,处处好风光";
int index = str.LastIndexOf("天", 1);//第二个参数表示起始位置,查找的时候就从起始位置开始找,没找到返回-1
Console.WriteLine(index);
//LastIndexOf经常配合Substring来截取文件名
string path = @"G:\b\c\d\e\起风了.mp3";
string str = path.Substring(path.LastIndexOf("\\") + 1);
Console.WriteLine(str);
9)、StartsWith():判断以....开始
string str = "今天天气好晴朗,处处好风光";
if (str.StartsWith("今天"))
{
Console.WriteLine("是的");
}
else
{
Console.WriteLine("不是的");
}
10)、EndsWith():判断以...结束
string str = "今天天气好晴朗,处处好风光";
if (str.EndsWith("风光"))
{
Console.WriteLine("是的");
}
else
{
Console.WriteLine("不是的");
}
11)、Replace():将字符串中某个字符串替换成一个新的字符串
string str = "国家关键人物老赵";
if (str.Contains("老赵"))
{
str = str.Replace("老赵", "**");
}
Console.WriteLine(str);
12)、Contains():判断某个字符串是否包含指定的字符串
13)、Trim():去掉字符串中前后的空格
14)、TrimEnd():去掉字符串中结尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
string str = null;
string str = "";
if (string.IsNullOrEmpty(str))
{
Console.WriteLine("是的");
}
else
{
Console.WriteLine("不是的");
}
17)、string.Join():将数组按照指定的字符串连接,返回一个字符串。
string[] names = { "张三", "李四", "王五", "赵六" };
string Newname = string.Join("|", "张三", "李四", "王五", "赵六" );
Console.WriteLine(Newname);