字符串的一些特性:
1.不可变性:由于字符串是不可变的。所以每次修改字符串都是创建一个单独的字符串副本(又拷贝了一个字符串。)
2.字符串池:当程序中有多个相同的字符串常量时,这时,这些字符串都是指向内存中的同一个字符串,这个特性叫做:字符串池。
3.(*)字符串留用:用string.Intern(string)。就是程序运行的时候,它会去字符串池寻找,看有没有和string一样的字符串,有就不开辟新的地址。
之所以字符串池,不会造成程序的混乱,是因为:字符串具有不可变性。
String 字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。
字符串的属性:
Length //获得字符串中字符的个数。”aA我速度”→5
方法
IsNullOrEmpty() 静态方法,判断为null或者为””
ToCharArray() 将string转换为char[],可以把一个字符串变成一个char数组,并且可以修改该数组。
ToLower() 小写,必须接收返回值。(因为:字符串的不可变);
ToUpper() 大写。
Equals() 比较两个字符串是否相同。 相当于“==”,在反编译工具中可以看出,在调用==的时候,也是调用了Equals()方法。
IndexOf() 如果没有找到对应的数据//返回第一次出现的索引位置。如果没有返回-1
LastIndexOf() 如果没有找到对应的数据,返回-1
Substring() //2个重载,截取字符串。
Split() //分割字符串。
Join() 静态方法,把字符串数组中的每个元素,用指定的连接符连接起来,最后得到一个完整的字符串
Format () 静态方法。通过占位符连接起来。用于拼接字符串。
Replace() 静态方法。替换
StringBuilder比string拼接优势:
在进行大量字符串拼接的时候,string的问题:
1.内存浪费,产生大量的垃圾内存。
2.由于String的不可变性,每次拼接都会创建一个新的string对象,每次创建新的对象的时候,本身也是比较耗时耗资源的,所以造成了使用String拼接字符串性能极其低下。
解决方法就是使用StringBuilder进行字符串拼接。
==以及Equals()
可以用他们来判断是否为同一个对象
由于string类型重写了从Object类中继承下来的Equals方法,怎么重写的呢?
只要两个字符串中的字符完全相同就返回true或者两个字符串是同一个对象也返回true。


using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; namespace 字符串 { class Program { static void Main(string[] args) { #region 字符串的不可变性 //string s1 = "I belive I CAN"; //s1.ToUpper(); //Console.WriteLine(s1); //string s2=s1.ToUpper(); //Console.WriteLine(s2); #endregion #region 字符串池 //string s1 = "Hello"; //string s2 = "Hello"; //Console.WriteLine(s1); //Console.WriteLine(s2); #endregion #region 字符串留 //string s1 = "a"; //string s2 = "b"; //string s3 = string.Intern(s1 + s2); //string x1 = "a"; //string x2 = "b"; //string x3 = string.Intern(x1 + x2); #endregion #region 用IndexOf计算天安门的格个数 //string tam = "111天天安门安天安门门是asdf美,天安门天安门是宽,天安afas门是天安门大"; //int starint = 0; //int cishu = 0; //while (true) //{ // int i = tam.IndexOf("天安门", starint); // starint = i + 3; // if (i == -1) // break; // else // { // cishu = cishu + 1; // } //} //Console.WriteLine(cishu); #endregion #region Substring使用 //string mu = "的发生的发发嘎嘎的撒恐[庄辉杰加油加油]惧感乏力可使肌肤垃圾垃圾反垃圾"; //int indexnum = mu.IndexOf("[") + 1; //int leftindexnum = mu.IndexOf("]"); //int length = leftindexnum - indexnum; //string newstring = mu.Substring(indexnum, length); //Console.WriteLine(newstring); #endregion #region split,join,replace ////string teams = "公牛|小牛|热火|快船|湖人"; ////string[] teamName = teams.Split('|'); //string teams = "公牛|小牛NBA热火NBANBA快船|湖人"; //string[] teamName = teams.Split(new string[] { "NBA", "|" }, StringSplitOptions.RemoveEmptyEntries); //foreach (var item in teamName) //{ // Console.WriteLine(item.ToString()); //} //string sjoin = string.Join("★", teamName); //Console.WriteLine(sjoin); //sjoin = sjoin.Replace("★", "为了挣钱,奋斗吧"); //Console.WriteLine(sjoin); #endregion #region 练习 //1.输入,然后倒序输出 //string shuru = Console.ReadLine(); //char[] oToCharArraylist=shuru.ToCharArray(); //string news=string.Empty; //for (int i = oToCharArraylist.Length-1; i >= 0; i--) //{ // news = news + oToCharArraylist[i]; //} //Console.WriteLine(news); //2.把年月日截取下来 //string datetime = "1991年8月26日"; //int yearnum=datetime.IndexOf('年'); //int monthnum=datetime.IndexOf('月'); //int monthnumlength=monthnum-yearnum; //int daynum=datetime.IndexOf('日'); //int daylength=daynum-monthnum; //string year = datetime.Substring(0, yearnum-1); //string month = datetime.Substring(yearnum+1, monthnumlength-1); //string day = datetime.Substring(monthnum+1, daylength-1); //Console.WriteLine("我的生日是{0}/{1}/{2}",year,month,day); //3.模拟读取电话本信息 //string[] phone = File.ReadAllLines(@"C://Dll_Log.txt"); //foreach (var item in phone) //{ // Console.WriteLine("分解前" + item); // string[] haha = item.Split(new char[] { ':'},StringSplitOptions.RemoveEmptyEntries); // foreach (var item2 in haha) // { // Console.WriteLine("分解后"+item2); // } //} ////4.123-456---7---89-----123----2把类似的字符串中重复符号去掉,既得到123-456-789-123-2. split()、 //string zhifu = "123-456---7---89-----123----2"; //string[] newszhifu = zhifu.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); //string newzhifu2=string.Join("-",newszhifu); //Console.WriteLine(newzhifu2); //5.从文件路径中提取出文件名(包含后缀) 。比如从c:\a\b.txt中提取出b.txt这个文件名出来。以后还会学更简单的方式:“正则表达式”, //项目中我们用微软提供的:Path.GetFileName();(更简单。) byte[] newsFile=File.ReadAllBytes(@"C://Dll_Log.txt"); string oGetFileName = Path.GetFileName(@"C://Dll_Log.txt"); Console.WriteLine(oGetFileName); string[] haha=oGetFileName.Split('.'); ////6.192.168.10.5[port=21,type=ftp] //string IPaddress = "192.168.10.5[port=21,type=ftp]"; //int no1=IPaddress.IndexOf('['); //int no2 = IPaddress.IndexOf(']'); //int no3 = IPaddress.IndexOf("port="); //int no4 = IPaddress.IndexOf("type="); //string IP=IPaddress.Substring(0, no1); //string port=IPaddress.Substring(no3 + 5, no4 - no3 - 6); //string serve=IPaddress.Substring(no4 + 5, no2 - no4 - 5); //string newstr=string.Format("IP:{0},端口:{1},提供的服务:{2},{3}", IP, port, serve,no1); //Console.WriteLine(newstr); #endregion #region StringBuilder的优势 //StringBuilder dd = new StringBuilder(); //dd.Append(string.Format("hah{0}", "nimazi")); //Console.WriteLine(dd); //Stopwatch watch = new Stopwatch(); //watch.Start(); //string s = string.Empty; //for (int i = 0; i < 10000; i++) //{ // s = s + "1234567891111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"; //} //watch.Stop(); //Console.WriteLine(watch.Elapsed); //StringBuilder sb = new StringBuilder(); //Stopwatch watch2 = new Stopwatch(); //watch2.Start(); //for (int i = 0; i < 10000; i++) //{ // sb.Append("1234567891111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); //} //watch2.Stop(); //Console.WriteLine(watch2.Elapsed); #endregion #region ==以及Equals char[] chars = { '你', '好' }; string s1 = new string(chars); string s2 = new string(chars); ////判断是否相同:对象是否相同或两个字符串中的字符完全相同 //if (s1.Equals(s2)) //{ // Console.WriteLine("相同"); //} //else //{ // Console.WriteLine("不同"); //} //最准确的判断是否为同一个对象的方法 if (object.ReferenceEquals(s1, s2)) { Console.WriteLine("是同一个对象"); } else { Console.WriteLine("不是同一个对象"); } #endregion Console.ReadKey(); } } }