NET基础学习笔记5

字符串的一些特性:

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();
        }
    }
}
这章的练习代码

 

 

posted @ 2013-07-16 01:00  偏执的放纵  阅读(153)  评论(0编辑  收藏  举报