c# string 和 StringBuilder 的区别

今天我们来看看 string 跟 StringBuilder 的不同 以及 应用的场景

一、1.我们来看看string的特性, string是不可变的,属于基元类型(传送门) ,也就是说:我们在程序中创建一个string str ="hello"; 并且赋值了 ‘hello’ 字符串,然后再对 str ="hello1"; 


如图所示,我们给str赋值了两次,这样会在托管堆中分配两块内存空间。

 二、StringBuilder :   从字面意思可以理解成  字符串的建造者,顾名思义 可以对字符串进行改造咯:下面我们来具体分析一下:


如图所示: 创建一个StringBuilder 对象,第一次给变量赋值‘hello’,然后在追加一个‘1’ 变成了‘hello1’了 ,但是 此时'hello'和‘hello1’是同一个地址对象的,也就是说:‘hello1’ 把‘hello’覆盖掉了 。他不会重新在内存中再次分配空间。所以 StringBuilder是 可变的。  在创建StringBuiler 对象的时候,需要显示的实例化。

例如 StringBuilder  str = new StringBuilder(); 


关键概念:

1.StringBuilder 最大容量,默认是Int32.MaxValue(约20亿吧,够大吧),当然你觉得这个容量 too big .你可以通过

Capacity来设置最大的容量值,但是你要确保你所操作的数值的长度不会超过你设置的值,否则 将抛出  ArumentOutOfRangeException的异常。

2,初始化容易,创建一个StringBuilder对象的时候,会创建一个char[] 的数组变量。默认指定的可维护长度是16,也可通过构造函数指定,  当我们追加内容的时候,StringBuilder会自动检测 数组会不会超过设置的容量值(这里指的是char数组的长度),如果会,StringBuilder 会自动倍增容量,然后用新容量分配新的字符数组,再把原始的数据copy到新的数组中,随后 原始数组可以被垃圾回收了。

3.字符数组: 它负责在StringBuilder维护‘字符串’的字符内容, 其字符长度总是小于或者等于容量和最大容量值的。StringBuilder提供了Lenght属性可以读写 char[]数组的长度值,当把length设置为0的时候,就清空掉StringBuilder内容,等同于 StringBuilder提供的 Clear()方法.


接下来分析一下两者的使用场景:

string 跟StringBuilder 所提供的方法大有不同,

例:StringBuilder 没有提供 大小写的转换,有的同学会想,先ToString(),在进行大小写转换, 但是 在调用Tostring()方法的时候,此时已经把StringBuilder转换成String 了。so  希望Microsoft开发团队 添加更多的字符串操作。

我们在根据两者的特性 ,在对字符高频繁操作的时候,使用StringBuilder 类型,这样减少内存的使用  提高程序的性能 。

猜你喜欢

转载自blog.csdn.net/u010838163/article/details/79999924