A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 江湖一浪人 中级黑马   /  2013-6-14 16:47  /  1221 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

System.String 和System.StringBuilder有什么区别?他们的内部工作原理是什么?能详细点解答,最好能举例说明!!!!

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 许庭洲 于 2013-6-14 17:12 编辑

1. String在进行运算时(如赋值,拼接等)会产生一个新的实例, 而StringBuilder则不会. 所以在大量字符串拼接或频繁对某一字符串进行操作时最好用StringBuilder, 不要使用String;
2. 如果要操作一个不断增长的字符串,尽量不用String类, 改用StringBuilder类.
3. 例如,字符串MyString1和MyString2相连接,实际上建立了三个字符串对象,把连接后的值"please enter your name"赋予了它. 这样就降低了代码的性能, 因为创建了新对象,分配了新空间, 而已经分配的空间实际上浪费了.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                     string MyString1 = "Please";
                     string MyString2 = "enter your name";
                     MyString1 = string.Concat(MyString, MyNewString);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如果采用StringBuilder类,就可以解决上面例子中的性能问题. StringBuilder不会创建新的对象. 看看下面改进后的代码:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                     StringBuilder MyStringBuilder = new StringBuilder("Please");
                     string MyNewString = "enter your name";
                     MyStringBuilder.Append(MyNewString);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

回复 使用道具 举报
本帖最后由 蔡志涛 于 2013-6-14 18:36 编辑


   两个类的工作原理不同 string类是一种传统的修改字符串的方法,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在NET框架下,这个操作实在是划不来,因为系统先是把对象,并读取内存中的数据付给该对象,这一来二去的,耗了不少时间。   而使用System Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。
    当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。
回复 使用道具 举报
如果需要频繁的 对字符串进行 赋值拆分组合 等操作就是用stringbuilder
如果只是一个参数或变量就用string
这两个只是在空间分配和效率上有区别

String   对象是不可改变的。每次使用   System.String   类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的   String   对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用   System.Text.StringBuilder   类。例如,当在一个循环中将许多字符串连接在一起时,使用   StringBuilder   类可以提升性能。

StringBuilder类并没有String类的功能强大,只提供基本的替换和添加和删除字符串中的文本,但它的工作效率非常高,当定义StringBuilder对象时可以指定内存的内存容量,如果不指定系统就会根据对象初始化时的字符串长度来确定。它有两个主要参数Length和Capacity分别表示字符串的实际长度和字符串占据的内存空间长度。对字符串的修改就是在这个内存中进行的,大大提高了添加和替换的的效率
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马