如果有理解错误的地方希望有朋友能指出,谢谢!
 
String是特殊的引用类型的,更像值类型,StringBuilder的是规规矩矩引用类型的。
 
首先看这样的对比图,Equals()方法是判断两个变量里面的值是否相等。
 
下面上代码和注释:
 
我们通过即时窗口直接获取他们所在的地址是什么?
其中我们发现引用类型sbA和sbB的地址是不一样的,所以通过比较运算符“==”得出的结果是false,而Equals比较值他们的值是“sss”,所以是true。
 
这里我们发现了一种情况,sA的地址竟然和sB的地址一样,还需要提及一个字符串拘留池的概念,具体概念百度。
我们继续探索,首先我们来看下这三个的地址:
s1和s2都是字符串“哈哈哈”,他们的栈地址也就是一样的,百度过字符串拘留池概念的人应该就明白了
下面我们来看一下传说中s4的地址:
我将是s1和s2拼接后返回给s4后,它的地址是:
 
然后再做一次操作:
得到s4的地址变化为:
 
既然拼接之后那我们之前的字符串还在吗?
 
事实说明s1还是存在的,那我们再换个方式测试一下
第一张图:
 
第二张图:
 
你会发现,重新申明的s5的地址竟然也是0x0224b310,应该是微软的垃圾回收没有执行,垃圾回收机制继续百度。
那我们手动的清理一遍,加上代码GC.Collect():
 
是不是有点X炸天的感觉,为什么不会被GC?
那我多执行GC几次:
 
看吧!别天真了,我觉得事实已经验证出来了。
没察觉需要注意的地方?那我们试试引用类型?
第一张图:
 
第二张图:
 
s1和s3是不是被顺利回收掉了。
 
字符串拘留池:如果将同一个字符串赋值给不同的字符串引用,那么系统会为多次分配内存空间,然而这些内存中存储的是同一个字符串。这不仅浪费了宝贵的内存,还极大程度的降低了系统的性能。为了改善程序的性能,.net提出了字符串拘留池机制来解决这一问题。一旦使用了字符串拘留池,当CLR启动的时候,会在内部创建一个容器,容器的键是字符串内容,值时字符串在托管堆上的引用。当一个新的字符串对象需要分配时,CLR首先检测容器中是否包含了该字符串对象,如果已经包含,就直接返回已经存在的字符串对象的引用;如果不存在,则新分配一个字符串对象,并把它添加到内部容器中同时返回该字符串对象的引用。但是当用new关键字显示的申明分配一个字符串对象时,字符串拘留池机制不会再起作用。(这个概念是百度来的)
 
我的结论:我们在执行大量字符串拼接的时候,尽量使用StringBuilder去处理,如果使用string类型,每一次拼接都会产生一个冗余字段且不能被回收,虽然看起来不多,但是我觉得这是需要注意的地方。尤其看到同事依然选择string去拼接一大串的SQL语句,是有一点弊端的,如果一个系统长期在运行,产生的冗余字段将是不可估量的!
 
本文仅供参考,如果我理解有误,希望有朋友能告知,谢谢!
 
扩展:至于刚才写代码为什么用“{0}”这样用参数的形式来去替换,而不是使用string拼接,或者使用StringBuilder,我也反编译了一下看了,底层还是通过StringBuilder下面的AppendFormat来实现的,再往下就是微软的高深动作了,不继续探索了,微软的优化稳妥妥!

String和StringBuilder的使用的更多相关文章

  1. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  2. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  3. 探秘Java中的String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  4. String PK StringBuilder,传说就是传说,只有动手实验,才能得出确定的答案

    本机测试结果如下: 大部分情况下,string 性能并不比StringBuilder差,只有特殊情况才出现差异,并非 如前面有些朋友测试的结果哪样,只要使用StringBuilder 就一定比Stri ...

  5. (原)String、StringBuilder、StringBuffer作为形参

    今天在刷一道算法题时,突然遇到StringBuilder作为形参和String作为形参时,最终得出来的结果不同.故尝试了几个demo看看它们之间的区别. 当String类型作为参数时, public ...

  6. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

  7. string与stringBuilder的效率与内存占用实测

    using UnityEngine; using System.Diagnostics; using System.Text; using UnityEngine.UI; public class s ...

  8. C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)

    前言 这一节主要来了解一下类和结构体之间的异同点.以及针对String和StringBuilder的用法.equals和==,其实可以看出很多地方都用到了上一节的值类型和引用类型.堆栈和装箱拆箱操作吧 ...

  9. 探秘Java中String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  10. String、StringBuilder

    public class testString{ public static void main(String[] args) { String a="cool"; String ...

随机推荐

  1. poj1251--Kruskal

    /* * poj1251-- Kruskal * date 2014/7/15 * state AC */ #include <iostream> #include <algorit ...

  2. python_基础学习_01_按行读取文件的最优方法

    python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...

  3. 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示

    原文:使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示 首先来看一看实现的效果: PS:原始的程序中更新曲线数据时添加了过渡的效果,具体可 ...

  4. HDU 2070 Fibbonacci Number

    Fibbonacci Number Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. update与fixedupdate差别

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=307 今天有人问我问什么我在处 ...

  6. 【百度地图API】自定义可编辑的交通路线

    原文:[百度地图API]自定义可编辑的交通路线 任务描述: 我想自己绘制一条从地铁站出口到天安门的道路,而且还需要根据我的喜好来改变这条路线. 如何实现: 鼠标左击地图,绘制路线:双击后,绘制结束:绘 ...

  7. 随记一个C的毫秒级群PING

    正好公司为了检测前台网络,力图收集有力证据与某CDN PK,所以随手写了一个群PING的程序. 写的内容比较简单,没有去特别追求线程效率,也没有去用LINUX 2.6+的殿堂级神器,以追求实现效率为主 ...

  8. Hack 语言学习/参考---1.2 Hack Background

    Hack Background Facebook was initially built with PHP. Parameters and return types were specified in ...

  9. XAMPP on Mac 组态 Virual Host

    首先,在hosts文件中添加virtual host域名.方向127.0.0.1 我一般使用的命名约定dev-domainname.com sudo nano /private/etc/hosts # ...

  10. 判断小数点位数不超过2位的JS代码和在删除确认框里面插JS代码

    <script type="text/javascript"> function checkDecimals(){ var decallowed = 2; var re ...