黑马程序员技术交流社区

标题: 关于字符串类的问题 [打印本页]

作者: 江湖一浪人    时间: 2013-6-14 16:47
标题: 关于字符串类的问题
System.String 和System.StringBuilder有什么区别?他们的内部工作原理是什么?能详细点解答,最好能举例说明!!!!


作者: 许庭洲    时间: 2013-6-14 17:01
本帖最后由 许庭洲 于 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:35
本帖最后由 蔡志涛 于 2013-6-14 18:36 编辑


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

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

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

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





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