黑马程序员技术交流社区

标题: System.String 和System.StringBuilder有什么区别? [打印本页]

作者: 天道酬勤_||淡腾    时间: 2014-5-8 19:00
标题: System.String 和System.StringBuilder有什么区别?
本帖最后由 天道酬勤_||淡腾 于 2014-5-9 12:15 编辑

System.String 和System.StringBuilder有什么区别?

作者: 林枫    时间: 2014-5-8 20:05
String对象初始化后值不可改变,StringBuilder对象初始化后能够改变。
打个比方
  1.             string a = "a";
  2.             a += "a";
  3.             StringBuilder b = new StringBuilder("a", 2);
  4.             b.Append("a");
  5.             Console.WriteLine("a={0},b={1}", a, b);
  6.             Console.ReadKey();
复制代码

他们两个输出的内容是一样的,但是过程却不一样,a先在内存中开辟了一个内存空间,大小为1,内容为"a"然后连接字符串"a"开辟一个新的内存空间,大小为2,内容为“aa”,然后把地址保存在a。b也开辟了一个内存空间大小为2,内容"a",然后在原空间加上"a",b只开辟了一个内存空间。
作者: 西瓜    时间: 2014-5-8 20:06
。这样吧,你每次为同一个字符串重新赋值的时候,都会创建一个新的字符串对象,要拿新的空间给它。比如
String str ="nihao";  //1
str+="a";               //2
你执行1的时候 内存里面是 nihao   ,执行2的时候 内存里面有三块 nihao  和  a  和 nihaoa  。
而你用StringBuilder 就是在第一块儿里面直接加,它是允许扩充的。
作者: 林枫    时间: 2014-5-8 20:08
在字符串大量修改的情况下,StringBuilder比String更有优势。
说的不对的地方还请指正
作者: 亚伦    时间: 2014-5-8 21:33
本帖最后由 亚伦 于 2014-5-8 21:44 编辑

System.Text.StringBuilder 和 System.String 很相似,在string能用的方法StringBuilder也能用。
System.Text.StringBuilder 的独特之处在于,当我们调用这个类型的函数成员时,都是直接修改对象内部的字符数据(因此更高效),而不是像string那样获得修改后格式的字符串副本。
另外string支持深复制,而StringBuilder支持的是浅复制(复制引用)。
  1.            // 例一
复制代码
  1.           // 例二
复制代码



作者: 亚伦    时间: 2014-5-8 21:45
  1. //例一
  2.             //StringBuilder sb = new StringBuilder("**");
  3.             //string s = "**";

  4.             //sb.Replace("*", "$");
  5.             //s = s.Replace("*", "$");

  6.             //Console.WriteLine(sb);
  7.             //Console.WriteLine(s);

  8.             // 例二
  9.             StringBuilder sb = new StringBuilder("**");
  10.             StringBuilder sb2 = sb; // 仅复制引用

  11.             Console.WriteLine(sb);
  12.             Console.WriteLine(sb2);
  13.             Console.WriteLine();

  14.             // 修改sb
  15.             sb.Replace("*", "$");

  16.             // sb2也改变了
  17.             Console.WriteLine(sb);
  18.             Console.WriteLine(sb2);
复制代码
代码怎么修改不了,论坛出问题了?

作者: .net_交流    时间: 2014-5-9 00:25
第次字符串改变时string会重新获得内存空间,而StringBuilder不需要每次都去分配内存空间。 当我们需要多次的对一个字符串进行多次操作的时候,用StringBuilder会节省内存开销,
作者: czwanglei    时间: 2014-5-9 08:40
当有人给你回复后,请把帖子编辑为提问结束,这样版主才给你加分。。




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