一、 . 字符串的特性:不可变性(ToUpper()演示)、字符串池、字符串留用(不常用)
1. 不可变性:由于字符串是不可变的。所以每次修改字符串都是创建一个单独的字符串副本(有拷贝了一个字符串);
2. 字符串池:当程序中有多个相同的字符串常量时,这时,这些字符串都是指向内存中的同一个字符符串,这个特性叫做:字符串池。
之所以字符串池不会造成程序的混乱,是因为:字符串具有不可变性。
3. 字符串留用(不常用,因为会有一定的内存损耗):
二、 string字符串
1. string的属性
1> Length //获得字符串中字符的个数
2. string的方法
1> IsNullOrEmpty() //静态方法,判断为null或者为空
(string str =“” 和string str= null和 string str = string.Empty的区别:stirng str = “”;会在堆内存中开辟一块儿内存空间,string str= null 则不会在堆中开辟内存空间,string str = string.Empty;和string str =”” 在堆内存中的地址是一样的。 使用str.Length == 0 来判断字符串是否为空,不要使用str ==””,str.Length==0的效率比较高,微软内部就是这样实现的。)
2> ToCharArray() //将string 转换为char[]
3> ToLower() //小写,必须接收返回值。(因为字符串的不可变)
4> ToUpper() //大写
5> Equals() //比较两个字符串是否相同。忽略大小写的比较Equals(obj,StringComparation.I….)。
6> IndexOf() //如果没有找到对应的数据,返回-1。返回对应的字符第一次出现未知的索引://作业:面试题:统计一个字符串中天安门出现的位置
7> LastIndexOf() //找到字符串最后一次出现的位置的索引,其他同IndexOf
8> Substring() //截取字符串 //作业:动态截取[某某某],获取第一次出现的索引的位置N1,获取第一次出现的索引位置N2。用N2-N1计算长度
9> Split() //可以根据字符把字符串分开
10> Join() //和split()正好是相反的;是将字符用指定的连接符连起来
11> Format() //利用占位符拼接字符串,并且返回
12> Trim() //去掉两边的空格
13> Replace() //执行替换
三、 StringBuilder
1.使用Stopwatch来监视程序运行用了多长时间。Start();stop(); sw.Elapsed//将最终的结果打印出来 //与程序的代码stringbuilder的内容无关
2. 使用大量字符串拼接的时候,String的问题:
1> 内存浪费,产生大量的垃圾内存
2> 由于String的不可变性,每次拼接都会创建一个新的string对象,每次创建对象的时候本身也是比较耗时耗资源的。所以造成了使用string拼接字符串性能极其低。
3> 解决方法就是使用stringbuilder
3. 只有使用大量字符串拼接的时候使用StringBuilder,其他的情况都用string。因为各种方法要求的参数都是string类型,并且string类型具有一些特性:不可变性、字符串池等。
4. StringBuilder的一些方法:
StringBuilder sb = new StringBuilder();
Sb.Append();//追加字符串
Sb.AppendLine();//拼接完最后添加一个换行
Sb.ToString();//把StringBuilder转换为字符串
Sb.Insert();//在指定字符中插入
Sb.Replace();//在指定的字符串中替换
四、 字符串的比较
1. String类型重写了Object类中继承下来的Equals方法。
重写为:只要两个字符串中的字符完全相同就返回true或者两个字符串是同一个对象也返回true
2. 由于Equals方法子类可以重写,所以通过Equals 方法判断是否为同一个对象是不正确的,所以判断两个对象是否同一个对象用:
Object.ReferenceEquals();//这个才是判断对象是否相等的方法。