如果有理解错误的地方希望有朋友能指出,谢谢!
 
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. SSIS从理论到实战,再到应用(5)----流程控制之Foreach循环

    原文:SSIS从理论到实战,再到应用(5)----流程控制之Foreach循环 上期回顾: SSIS从理论到实战,再到应用(4)----流程控制之For循环 上一期讲了For循环,Foreach循环相 ...

  2. 第23章 访问者模式(Visitor Pattern)

    原文 第23章 访问者模式(Visitor Pattern) 访问者模式 导读:访问者模式是我个人认为所有行为模式中最为复杂的一种模式了,这个模式可能看一遍会看不懂,我也翻了好几个例子,依然不能很好的 ...

  3. jQuery 的 serializeArray()、serialize() 方法

    serializeArray()方法说明: 实例 输出以数组形式序列化表单值的结果: $("button").click(function(){ x=$("form&qu ...

  4. oracle_安装_win7+64位+Oracle+11g+64位下使用PLSQL+Developer+的解决办法

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic-wi ...

  5. ORA-00911:无效字符错误

    ORA-00911:无效字符错误--造成构建环境的一个小错误 实施某功能脚本语句.编译时,出现了ORA-00911错误,当时有些疑惑,之前生产库使用是没有问题的,经过一番检查后发现原来是一个非常细微的 ...

  6. Log4j2 简明教程

    一.概述 log4j2官方文档内容非常多,要一次性了解全部是不可能的.正确的步骤应当是先了解最常见的配置,当发现原有知识无法解决问题,再重新查看文档看有没有合适的配置.下面将从文件结构入手,再到简单的 ...

  7. sql事务,在sql2000里判断执行是否成功用@@ERROR 判断

    原文:sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 贴个sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 这个东西多少还是有点问题,sql2005了可以用t ...

  8. (工具)source insight高速增加时间代码

    这篇文章是程序代码更改由其他用户. 不是原厂原装,例如下列总结,使用作为个人笔记. (1)打开projectbase.打开文件Utils.em,插入下面代码: //插入时间 macro MonthTo ...

  9. SSAS系列——【02】多维数据(维度对象)

    原文:SSAS系列——[02]多维数据(维度对象) 1.维度是什么? 数学中叫参数,物理学中是独立的时空坐标的数目.0维是一点,1维是线,2维是一个长和宽(或曲线)面积,3维是2维加上高度形成体积面. ...

  10. TextView随键盘弹出上移高度

    很多时候我们都在为键盘遮挡了原本就不大的屏幕时而烦恼,特别是当用户处于编辑状态时,键盘下面的内容就看不见了,用户只能处于盲打状态了.现在有一种简单的解决办法,基本思路就是,添加通知.一直监听键盘事件, ...