C#中 为什么说String是不可变字符串,StringBuilder是可变字符串

来源:百度知道 编辑:UC知道 时间:2024/05/24 00:44:12
C#中 为什么说String是不可变字符串,StringBuilder是可变字符串,

这个有什么为什么呢,.NET的类库就是这么设计的呀.
比如:
string str="1234";
string str1="5678";
str=str+str1;
这时候str变成了"12345678";
表面上看好像是字符串"1234"变成了"12345678",其实不是的.
String是引用类型,一开始str引用了内存中"1234"的地址,执行str+str1的时候,实际上是在内存中重新生成了一个"12345678"的String变量,而不是在原来的"1234"上增加一段,然后再把str的引用设置到新的"12345678"上.

而StringBuilder不同,它可以在原来的字符串末尾加上新的字符串.

So,如你所问...

String、StringBuffer、StringBuilder
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象(为什么 问问 Java 的设计者吧,为什么 String 不是原生类型呢 )因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。这里尝试举个不是很恰当的例子:

String S1 = “abc”;
For(int I = 0 ; I < 10000 ; I ++) // For 模拟程序的多次调用
{
S1 + = “def”;
S1 = “abc”;
}

如果是这样的话,到这个 for 循环完毕后,如果内存中的对象没有被 GC 清理掉的话,内存中一共有 2 万