String与StringBuilder关系

来源:互联网 发布:北京现代软件学院 图片 编辑:程序博客网 时间:2024/04/30 12:04

String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String

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

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

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

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

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

1、String创建一个不可改变的对象,StringBuilder创建一个可以改变的对象。
string str1 = "a";
str1 = "b";
给str1更改值等效新建一个String对象。
string使用“=”操作符实际上就是new   string(info)

2、StringBuilder 类解决了对字符串进行重复修改的过程中创建大量对象的问题。初始化一个StringBuilder 之后,它会自动申请一个默认的StringBuilder 容量(默认值是16),这个容量是由Capacity来控制的。并且允许我们根据需要来控制Capacity的大小,也可以通过Length来获取或设置StringBuilder 的长度。

听起来好象StringBuilder比String好很多。是不是到处都用StringBuilder呢?很明显肯定不是了。要不c#也不会要这个String。
看看下面两张图片(摘自http://www.cnblogs.com/kid-li/archive/2006/10/18/532174.html):
====================================
李建忠老师讲解了一下copy-to-write技术。对于两个String类型的变量来说,如下

String str1 = “aa”;

String str2 = “aa”;

当这两个String类型变量的值相同时,实际上他们指向的是同一个内存空间,如下图:

 


   对于
StringBuilder对象来说是这样的,如:有两个StringBuilder对象

       StringBuilder sb1 = new StringBuilder(“aa”)

       StringBuilder sb2 = new StringBuilder(“aa”)

他们在内存中的状态如下图:
   

sb2变化时,只是修改sb2中指向的位置。如下图


==============================

原创粉丝点击