1.string和 stringbuilder的区别:

String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。 一:不可改变对象  在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。这句话初听起来似乎有些不可思议,大家也许马上会想到字符串的连接操作,我们不也可以改变字符串吗?看下面这段代码:

1 using System;

2

3 namespace Demo1

4  {

5      ///<summary>

6     /// String连接测试

7     /// </summary>

8     public class Test

9      {

10         public static void Main(string[] args)

11          {

12             string a = "1234";

13             Console.WriteLine(a);

14

15             a += "5678";

16             Console.WriteLine(a);

17             Console.ReadLine();

18         }

19     }

20 }

21   运行的结果:  1234     12345678    看起来我们似乎已经把MyStr的值从“1234”改为了“12345678”。事实是这样的吗?实际上并没有改变。在第5行代码中创建了一个String对象它的值是“1234”,MyStr指向了它在内存中的地址;第七行代码中创建了一个新的String对象它的值是“12345678”,MyStr指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了它们中的一个,但是字符串“1234”仍然在内存中驻留。      二:引用类型  前面说过String是引用类型,这就是如果我们创建很多个相同值的字符串对象,它在内存中的指向地址应该是一样的。也就是说,当我们创建了字符串对象a,它的值是“1234”,当我们再创建一个值为“1234”的字符串对象b时它不会再去分配一块内存空间,而是直接指向了a在内存中的地址。这样可以确保内存的有效利用。看下面的代码:

1 using System;

2

3 namespace Demo2

4  {

5      ///<summary>

6     /// String引用类型测试

7     /// </summary>

8     public class Test

9      {

10         public static void Main(string[] args)

11          {

12             string a = "1234";

13

14             Console.WriteLine(a);

15

16             Test.Change(a);

17

18             Console.WriteLine(a);

19             Console.ReadLine();

20         }

21

22         public static void Change(string s)

23          {

24             s = "5678";

25         }

26     }

27 } 运行结果:  1234     1234

做一个小改动,注意Change(ref string s)

1 using System;

2

3 namespace Demo2

4  {

5      /// <summary>

6     /// String引用类型测试

7     /// </summary>

8     public class Test

9      {

10         public static void Main(string[] args)

11          {

12             string a = "1234";

13

14             Console.WriteLine(a);

15

16             Test.Change(ref a);

17

18             Console.WriteLine(a);

19             Console.ReadLine();

20         }

21

22         public static void Change(ref string s)

23          {

24             s = "5678";

25         }

26     }

27 }

28  运行结果:  1234   5678

三:StringBuilder对象  通过上面的分析可以看出,String类型在做字符串的连接操作时,效率是相当低的,并且由于每做一个连接操作,都会在内存中创建一个新的对象,占用了大量的内存空间。这样就引出StringBuilder对象,StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。但是这两者之间的差别到底有多大呢?来做一个测试:

1 using System;

2 using System.Text;

3

4 namespace Demo5

5  {

6      ///<summary>

7     /// String和StringBulider比较

8     /// </summary>

9     public class Test

10      {

11         public static void Main(string[] args)

12          {

13             string a = "";

14            StringBuilder s = new StringBuilder();

15

16            int times = 10000;

17             intstart,end;

18

19              ///测试String所用的时间

20             start = Environment.TickCount;

21             for(int i=0;i<times;i++)

22              {

23                 a += i.ToString();

24             }

25             end = Environment.TickCount;

26             Console.WriteLine((end-start));

27

28              ///测试StringBuilder所用的时间

29             start = Environment.TickCount;

30             for(int i=0;i<times;i++)

31              {  3

2                s.Append(i.ToString()); 33             }

34             end = Environment.TickCount;

35             Console.WriteLine((end-start));

36

37             Console.ReadLine();

38         }

39     }

40 }

41  运行结果:  884   0

通过上面的分析,可以看出用String来做字符串的连接时效率非常低,但并不是所任何情况下都要用StringBuilder,当我们连接很少的字符串时可以用String,但当做大量的或频繁的字符串连接操作时,就一定要用StringBuilder。     String是固定不变的,在进行字符串连接的时候是新建一个字符串,进行连接后,最后赋值, 如果对String赋值多次,就会在内存中保存多个这个对象的副本,浪费系统资源    StringBuilder是可变的,不用生成中间对象,拼接字符串比较多,或字符串的长度比较长时有较高的效率。  StringBuilder的内存空间不够也要扩容,如果分配的空间远远大于需要量,也很浪费 所以,初始化StringBuilder的时候最好根据需要设置容量,避免浪费

引用网址链接:http://wenku.baidu.com/view/8b2a76d7b14e852458fb57fe.html

String类型 在底层剖析,并比较 与StringBuilding 的区别的更多相关文章

  1. C++的string类型和继承C语言风格的字符串的区别与注意事项

    1.尽可能地在C++程序中使用string,不要使用继承而来的C语言风格的字符串,会出现许多安全问题. 2.C语言的字符串风格,是以空字符结束的,在C++的头文件cstring中定义了C语言风格的字符 ...

  2. 【.Net底层剖析】3.用IL来理解属性

    .Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 未完待 ...

  3. 揭秘String类型背后的故事——带你领略汇编语言魅力

    字符串或串(String)是由数字.字母.下划线组成的一串字符.一般记为 s=“a1a2···an”(n>=0).它是编程语言中表示文本的数据类型.在程序设计中,字符串(string)为符号或数 ...

  4. String类型为什么不可变

    在学习Java的过程中,我们会被告知 String 被设计成不可变的类型.为什么 String 会被 Java 开发者有如此特殊的对待?他们的设计意图和设计理念到底是什么?因此,我带着以下三个问题,对 ...

  5. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

  6. 【.Net底层剖析】2.stfld指令-给对象的字段赋值

    .Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 引言: ...

  7. 使用==比较String类型

    String类型的比较 public class StringDemo { public static void main(String[] args) { String s1 = "abc ...

  8. java的String类型为什么是final

    (转自:http://www.cnblogs.com/ikuman/archive/2013/08/27/3284410.html) 最佳答案: 主要是为了“效率” 和 “安全性” 的缘故.若 Str ...

  9. 【Java】 String类型的==使用

    public class StringDemo { public static void main(String[] args) { String s1 = "abc"; Stri ...

随机推荐

  1. Python全栈day18(三元运算,列表解析,生成器表达式)

    一,什么是生成器 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器是可迭代对象. 二,生成器分类在python中的表现形式 1 ...

  2. 关于ios7 UINavigationController.interactivePopGestureRecognizer手势集成

    因为公司业务需求,结合网上的资料整理了一下. 如果自定义过navbar的leftbarbutton 或者backbarbutton 原生interactivePopGestureRecognizer默 ...

  3. python AI(numpy,matplotlib)

    http://blog.csdn.net/ywjun0919/article/details/8692018 apt-cache policy python-numpy sudo apt-get in ...

  4. iass,pass,cass,sass,vm,container

    分布式存储hdfs 大文件,swift 对象存贮. 为七牛的CDN系统目前大部分还不是自建的,采用的是整合其它CDN的方式做的.也就是说出了七牛的文件分发使用的是网宿和蓝汛的老牌CDN的分发节点,自身 ...

  5. spring常见注解说明

    1. @ActiveProfiles("test") 我理解这个注解的主要用途是区分不同的环境.一般公司开发一个项目时,会区分测试环境.生产环境等.添加该注解,说明读取的profi ...

  6. (1.3.1)连接安全(连接实例与网络协议及TDS端点)

    连接安全是sql server安全配置的第1道防线,它保证只有许可的客户端能够连接sql server,而且可以限制连接可用的通道(各种网络协议). 1.连接到sql server实例 sql ser ...

  7. 前端 javascript 数据类型 数字

    1.数字(Number) JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值表示. 转换: parseInt(..)    将某值转换成数字,不成功则NaN pa ...

  8. spring MVC 学习(四)---拦截器,视图解析器

    1.接口HandlerInterceptor 该接口包含3个方法,分别是preHandle,postHandle,afterCompletion,分别代表着执行前,执行后,执行完成要执行的方法,其中p ...

  9. angular-file-upload

    <div id="page-title"> <h2 class="title-hero" ng-if="!isEdit"& ...

  10. python3 爬虫神器pyquery的使用实例之爬网站图片

    PyQuery 可让你用 jQuery 的语法来对 xml 进行操作,这和 jQuery 十分类似.如果利用 lxml,pyquery 对 xml 和 html 的处理将更快. 如果对 jQuery  ...