如果有理解错误的地方希望有朋友能指出,谢谢!
 
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. Android JNI环境要SQLite加密模块简介

    免费的SQLite开源源代码仅仅给提供了两个函数,仅仅有实现这两个函数才干实现数据库总体加密. 然后废了点劲从网上找了一个已经实现好的开源库http://sourceforge.net/project ...

  2. CSS设置滚动条样式[转]

    原文转载地址:http://www.javascript100.com/?p=756 webkit浏览器css设置滚动条 主要有下面7个属性 ::-webkit-scrollbar 滚动条整体部分,可 ...

  3. xcode于Archive当产生安装包遇到ld: library not found for -lPods

    此问题是由能力很困扰,通常有以下几个方案 进target的 Build Phases- Link binary Library.到场libPods.a,假设是红.删,能够 其他解决方案 Build S ...

  4. 为代码减负之<一>触发器(SQL)

    对触发器一词早有耳闻(最早是在耿大妈的数据库视频中),当初看完视频后,对理解不深刻的东西如:触发器,存储过程,事务,日志等等没有具体的去查阅,也没有具体的去尝试,应用.所以才导致了今天的博客(把曾经丢 ...

  5. Jquery--仿制360右下角弹出窗口

    原文:Jquery--仿制360右下角弹出窗口 先发浏览器效果图,给大家看. 要实现这样的效果,按照思路,第一步,写好CSS布局,将图片放到浏览器右下角的位置 CSS代码很灵活,我写的只是简单的一种而 ...

  6. ajax提交与上传文件同步

    我们经常担心文件上传,最烦比,可以推断,我们上传的文件大小,格风格等等一系列的推理验证.所以,我们只能ajax提交验证.ajax异步提交太麻烦,我想太多的变化代码,事实上,我们使用JQuery当插件, ...

  7. LeetCode——Flatten Binary Tree to Linked List

    Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 4 6 ...

  8. 它们的定义app.config中间section节点和在执行中使用

    如果现在我们需要在app.config一个节点的在下面的例子中,定义,我们需要如何进行操作? <configSections> <section name="integra ...

  9. Linux常用命令3--如何设置IP地址?如何更改系统时间?

    Linux常用命令 系统状态监控 [1]ps:用于显示当前系统中运行的进程. 语法:ps [-option]:常用的参数有:-a;-u;-x;-e;-f. -a:显示所有进程: -u:显示所有用户: ...

  10. 关于Cassandra与Thrift在int/text/varint上的暧昧

    近期简单写了一个基于Cassandra/C++的日志缓存,虽然是Nosql,但是在实际应用中,还是期望能有部分的临时CQL统计 或+-*/可以支持 所以在针对部分字段入库时,选择了作为整形录入,于是麻 ...