黑马程序员技术交流社区

标题: 关于string和StringBuilder的区别?求高手解释 [打印本页]

作者: 蒋春    时间: 2012-5-29 20:38
标题: 关于string和StringBuilder的区别?求高手解释
            string str1 = "aa";
            str1 += "bb";
            Console.WriteLine(str1);
            StringBuilder str = new StringBuilder("aa");
            str.Append("bb");
            Console.WriteLine(str);
定义str1和str字符串,str1使用+=方式赋值,str使用Append方法赋值
然而最后结果是一样的,str的Append方法是在字符传后面追加,请问他们两个变量在内存中的地址和释放情况是?哪个更节用资源
作者: 聂玉林    时间: 2012-5-29 21:27
应该是后面那个更省资源
作者: 牛景亮    时间: 2012-5-29 22:16
String 对象是不可改变的,像你用的
  string str1 = "aa";
    str1 += "bb";
第一次分配固定空间,而如果追加"bb",就必须重新分配空间,将原来的"aa"copy出来和"bb"一起放到新空间中。
而如果是 StringBuilder 只需要扩大空间将"bb"加到后面就行了,不需要copy原来的了,所以性能比string好
作者: 蒋春    时间: 2012-5-30 08:03
那就是说string类型的字符串,同一个字符串被第二次赋值后,第一次的值和地址在内存中还存在?
作者: liuzhengyong    时间: 2012-5-30 20:04
string对象,是从新分配堆地址,原先指向aa的引用,现在指向bb这个地址了。而stringbuilder直接在后面追加,性能还是stringbuilder好。
作者: 钟广雄    时间: 2012-6-7 22:24
string,是重新分配堆地址。而stringbuilder直接在后面追加,性能还是stringbuilder好。但个人建议虽然tringbuilder性能比较好,如果要是用到比较少的字符 还是用string比较好,如需要追 加大量的字符时,必然stringbuilder,要用到洽到好处,才知道哪个好,
作者: 钟山山    时间: 2012-6-8 08:29
       String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。
       而stringbuilder直接在后面追加,性能还是stringbuilder好。
作者: 李朋霏    时间: 2012-7-16 23:16
string 的值是不会变的,在修改它时必须创建一个新的,这样占内存,产生大量临时中间字符;
stringBuilder则是创建好了,直接追加,只不过需要to.string()转化为字符串格式即可。
作者: 许楠    时间: 2012-7-17 17:29
String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String

另外,对于 String 我们不得不多说几句:

1.它是引用类型,在堆上分配内存

2.运算时会产生一个新的实例

3.String 对象一旦生成不可改变(Immutable)

3.定义相等运算符(== 和 !=)是为了比较 String 对象(而不是引用)的值




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2