如果有理解错误的地方希望有朋友能指出,谢谢!
 
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. hdu Jungle Roads(最小生成树)

    Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of for ...

  2. linux_cp_远程copy

    1:远程copy  [linux对linux 远程拷贝]   scp 文件名  root@远程ip:/路径/    将本地home目录下的test.tar的文件拷贝到远程主机192.168.1.23的 ...

  3. Swift # 项目框架

    利用Swift--简单的项目界面流程. TabBar+Navigation底部导航控制,界面的切换. GitHub源码分享,地址: URL:https://github.com/SpongeBob-G ...

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

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

  5. sql server 查看表的行数

    SELECT  a.name ,        b.[rows]FROM    dbo.sysobjects AS a        LEFT JOIN sysindexes AS b ON a.id ...

  6. hdu149850 years, 50 colors (多个最小顶点覆盖)

    50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  7. Linux之ftp命令使用

    一:前言 在达内參加暑期社会实践,达内公司免费教授了一星期的课,当时认为老师用ftp命令用的非常爽.所以回来学学了. 二:分类 有关FTP(client,server搭建这里不讲)有非常多,大体分为命 ...

  8. oracle 非数字型转数字型

    原文:oracle 非数字型转数字型 oracle中如果一个字段内容不全是数字型 可以通过以下方式过滤 to_number(substr(translate(a.vital_signs_cvalues ...

  9. 解决Postman发送post数据但是Node.js中req.body接收不到数据的问题[已解决]

    之前编写后台接口,测试数据都是使用的Postman,相当的方便,之前也一直使用get方法,编写Node.js一直没有问题,但是由于要编写一个注册/登陆的功能,所以发送的post数据,后台的逻辑已经编写 ...

  10. String 的intern() 方法说明

    1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...