如果有理解错误的地方希望有朋友能指出,谢谢!
 
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. 大数据系列修炼-Scala课程10

    今天主要是关于Scala中对List的相关操作,list在Scala中应该是至关重要,接下来会讲解关于List的一系列操作 List的map.flatMap.foreach.filter操作讲解 1. ...

  2. IE打印的参数配置说明

    IE自动给我们在页眉和页脚处加上了这些不必要的打印信息.如果我们不想要任何页眉和页脚的话,直接删除它们就行了.:-)大部分时候我都是这样做的.但如果你想自定义页眉和页脚的时候,该怎么做呢?上面的那些“ ...

  3. js中prototype用法(转)

    JavaScript能够实现的面向对象的特征有:·公有属性(public field)·公有方法(public Method)·私有属性(private field)·私有方法(private fie ...

  4. 至尊快速,国产语言RPP 1.83强势来袭

    以下是 R++的性能測试数据:(奔腾 1.86GHZ,測试 3 次取平均值) 执行效率: R++的内部结构和 C++大致同样,所以理论上 R++能够达到和 C++一样的执行速度,眼下 R++已开启汇编 ...

  5. CSharp设计模式读书笔记(11):外观模式(学习难度:★☆☆☆☆,使用频率:★★★★★)

    定义: 外观模式:为子系统中的一组接口提供一个统一的入口.外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 模式角色与结构: 示例代码: using System; using Sys ...

  6. The Swift Programming Language-官方教程精译Swift(2)基础知识

    Swift 的类型是在 C 和 Objective-C 的基础上提出的,Int是整型:Double和Float是浮点型:Bool是布尔型:String是字符串.Swift 还有两个有用的集合类型,Ar ...

  7. Access denied for user: 'root@localhost' (Using password: YES)

    centos 设备mysql成功后 首次使用root登录发生:Access denied for user: 'root@localhost' (Using password: YES) 因为mysq ...

  8. 使用C/C++发展Web系统开源

    下载 见 C++开发的论坛系统 - BBS 下载地址:Fetch_source_code_release_vse2008_v1.2.1.7z 眼下先暂存在百度云上,最近会放入github 当前版本号的 ...

  9. C# ASP.NET CSV文件导入数据库

    原文:C# ASP.NET CSV文件导入数据库 using System; using System.Collections.Generic; using System.Text; using Sy ...

  10. ASP.NET MVC企业级项目框架

    ASP.NET MVC企业级项目框架 MVC项目搭建笔记---- 项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,搭建过程内容比较多,结合了抽象工厂 ...