C#基础----string和stringBuilder

本文深入探讨C#中字符串(string)与字符串构建器(StringBuilder)的特点与应用场景,包括不可变性、暂存池机制、字符串留用及性能对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string

string的特性:不可变性,字符串一旦创建,就不可以改变;字符串暂存池(针对字符串常量);字符串留用。

            string s1 = "abc";
            s1 = "cba";
            Console.WriteLine(s1);
            Console.ReadKey();


          //由于字符串的不可变性,所以造成了当多个字符串进行拼接的时候,造成内存的浪费以及时间的消耗(因为每次创建对象都要消耗时间,创建对象也是有成本的。)
            string s = "a";
            s = s + "b";
            s = s + "c";
            s = s + "d";
            Console.WriteLine(s);
            Console.ReadKey();


            string s1 = "abc";
            string s2 = new string(new char[] { 'a', 'b', 'c' });

字符串暂存池:内部维护一个哈希表key为字符串,value为地址,每次为一个新变量赋值都会找key中是否有,如果有则直接把value中的地址赋值给新变量

字符串留用:对于动态字符串本身在哈希表中没有,通过这种Intem可以添加到该哈希表中,目的是为了调高性能。

String.Intem()方法使用暂存池来搜索与str值相等的字符串,如果存在这样的字符串,则返回暂存池中它的引用,如果不存在,则向暂存池添加对str的引用,返回返回该引用。

String.IsItemed()此方法在暂存池中查找str,如果已经将str放入暂存池中,则返回对此实例的引用,否则返回nullNothingnullptrnull引用


 string可以看做是char的只读数组。char c = s[1];

C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。
如果要对char进行修改,那么就必须创建一个新的字符串,用s. ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数(暂时不用细研究)来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。例子:将字符串中的A替换为a。


string str = nullstring str = “”说明其中的区别。

答:string str = null是不给他分配内存空间,string str = “”给它分配长度为空字符串的内存空间。 string str = null没有string对象,string str = “”有一个字符串对象。


要区分变量名和变量指向的值的区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是
字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。


String 字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。
属性:Length//获得字符串中字符的个数。”aA我你他”→5
方法
IsNullOrEmpty() 静态方法,判断为null或者为””(静态方法)
ToCharArray() 将string转换为char[]
ToLower()  小写,必须接收返回值。(因为:字符串的不可变);
ToUpper()      大写。
Equals()      比较两个字符串是否相同。  忽略大小写的比较,StringComparation.
IndexOf()如果没有找到对应的数据,返回-1.//面试题:统计一个字符串中,天安门”出现的次数。 
LastIndexOf() 如果没有找到对应的数据,返回-1
Substring()  //2个重载,截取字符串。
Split()   //分割字符串。 
Join()  静态方法,String.Join()
Format  ()  静态方法
Replace()
boolContains(string value)判断字符串中是否含有子串value
boolStartsWith(string value)判断字符串是否以子串value开始;
boolEndsWith (string value)判断字符串是否以子串value结束;


StringBuilder
StringBuilder高效的字符串操作
当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。
String对象是不可变的。每次使用 System.String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的String 对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
StringBuilder  !=String//StringBuilder转换为String.ToString();
StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.
StringBuildersb = new StringBuilder();
sb.Append();//追加字符串
sb.ToString();//把StringBuilder转换为字符串。
sb.Insert();
sb.Replace();
StringBuilder 每次修改都是修改同一个块内存中的值,不会重复创建大量对象,也不会产生垃圾内存,所以大大提高了字符串拼接的效率。建议大量字符串拼接的时候首选StringBuilder 


StringBuilder String 的区别?(*)
答:String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder 则不会。所以在大量字符串拼接或频繁对某一

字符串进行操作时最好使用StringBuilder,不要使用String如果要操作一个不断增长的字符串,尽量不用String,改用StringBuilder

类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没

,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一

String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder

就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二

者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间String类简直不是一个数量级

的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值