字符串在.Net中既有值类型的特点又有引用类型的特点,字符类型也称作为不可变对象类型,字符串类型在使用上可以说占很大的比例,每次使用的时候都要重新开辟一个新的空间,这样会大量消耗内存,所以微软给我们一个名为String Intern Pool的字符暂存池,我在重复使用这个字符串的时候不需要重新开辟一个新的空间,只需要从这个池子里面获取即可。

我们在新建一个字符的时候,首先去暂存池获取有没有这个字符,如果没有则把这个新的字符串保存到暂存池。

下面是string类的两个方法

        //// 摘要://     检索系统对指定 System.String 的引用。//// 参数://   str://     要在暂存池中搜索的字符串。//// 返回结果://     如果暂存了 str,则返回系统对其的引用;否则返回对值为 str 的字符串的新引用。//// 异常://   T:System.ArgumentNullException://     str 为 null。[SecuritySafeCritical]public static String Intern(String str);//// 摘要://     检索对指定 System.String 的引用。//// 参数://   str://     要在暂存池中搜索的字符串。//// 返回结果://     如果 str 在公共语言运行时的暂存池中,则返回对它的引用;否则返回 null。//// 异常://   T:System.ArgumentNullException://     str 为 null。[SecuritySafeCritical]public static String IsInterned(String str);

字符串暂存池(intern pool)其实是一张哈希表,键是字符串字面量,值是托管堆上字符串对象的引用。在加载程序集时,不同版本的CLR对于是否留用程序集元数据中的字符串字面量(在编译时值已确定)不尽相同。
我们在给string类型变量分配字面量值时,CLR会先到字符串池中看下有没有完全相同的字符串(区分大小写),若有则返回对应的引用,若无,则创建新对象并添加到字符串池中返回引用。但若在运行时(如,使用new关键字)来给字符串变量分配值则不会使用字符串池。

string a = "abc";
string b = "abc";
string c = new string(new char[] { 'a', 'b', 'c' });Console.WriteLine(a.Equals(b));
Console.WriteLine(a.Equals(c));Console.WriteLine(object.ReferenceEquals(a, b));//true
Console.WriteLine(object.ReferenceEquals(a, c));//false

下面我们针对这个来测试一波性能

1.测试十万条数据字符拼接

2.测试不同字符串拼接

3.测试相同字符拼接

代码如下:

//针对相同字符拼接
Stopwatch sw1 = new Stopwatch();
string a = "a";
string b = string.Empty;
sw1.Start();
for (int i = 0; i < 100_000; i++)
{b += a;
}
sw1.Stop();
Console.WriteLine($"相同字符拼接消耗时间={sw1.ElapsedMilliseconds}");
//针对不同字符拼接
Stopwatch sw2 = new Stopwatch();
string c = string.Empty;
sw2.Start();
for (int i = 0; i < 100_000; i++)
{//i.ToString();c += i.ToString();
}
sw2.Stop();
Console.WriteLine($"不同字符拼接消耗时间={sw2.ElapsedMilliseconds}");
//检测装箱的时间
Stopwatch sw3 = new Stopwatch();
string d = string.Empty;
sw3.Start();
for (int i = 0; i < 100_000; i++)
{i.ToString();
}
sw3.Stop();
Console.WriteLine($"检测装箱消耗的时间{sw3.ElapsedMilliseconds}");

结果如下

相同字符拼接消耗时间=1695
不同字符拼接消耗时间=26925
检测装箱消耗的时间12

一名正在抢救的coder

笔名:mangolove

CSDN地址:https://blog.csdn.net/mango_love

GitHub地址:https://github.com/mangoloveYu

.Net字符暂存池(String Intern Pool)相关推荐

  1. 常量池之字符串常量池String.intern()

    运行时常量池是方法区(PermGen)的一部分. 需要提前了解: 1. JVM内存模型. 2. JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现 ...

  2. 【java进阶之路】(Java基础篇)[扩展]深入解析String.intern()及字符串常量池问题

    申明 : 此文仅仅作为个人学习使用 , 如果有人对于String.intern() 十分想要究其原理 , 请参考此文深入解析String#intern - 美团技术团队 8种基本类型的常量池都是系统协 ...

  3. Java基础提升篇:理解String 及 String.intern() 在实际中的应用

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...

  4. Java提升篇:理解String 及 String.intern() 在实际中的应用

    String的深入解析 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些 ...

  5. 理解Java字符串常量池与intern()方法

    理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...

  6. String,intern()有关的那点事儿

    String,是Java中除了基本数据类型以外,最为重要的一个类型了.很多人会认为他比较简单.但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对: Q1:String s ...

  7. c++ 返回string_JVM系列之:String.intern和stringTable

    简介 StringTable是什么?它和String.intern有什么关系呢?在字符串对象的创建过程中,StringTable有起到了什么作用呢? 一切的答案都在本文中,快来看看吧. intern简 ...

  8. String.intern()的用法

    String.intern()官方给的定义: When the intern method is invoked, if the pool already contains a string equa ...

  9. 深入解析String#intern

    为什么80%的码农都做不了架构师?>>>    引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了 ...

最新文章

  1. Tarjan求割点桥
  2. C语言Socket动态ajax网页,简单的ajax聊天网页 socket
  3. 【Android 逆向】Android 逆向通用工具开发 ( Android 逆向通用工具组成部分 | 各模块间的关联 )
  4. OpenCV Hit or Miss 击中或没打中的实例(附完整代码)
  5. jmeter接口测试----9函数助手: random, counter, time
  6. Linux网络编程 | 高性能定时器 :时间轮、时间堆
  7. AnalyticDB for PG 如何作为数据源对接帆软 FineBI
  8. java高并发临时表_不适用临时表进行分页,筛选,查询,避免高并发的方法。...
  9. 智慧社区防控(测温)
  10. PHP设计模式系列 - 数据访问对象模式
  11. 拿到人工智能offer,一个腾讯,一个阿里,选哪个?
  12. lua能在stm32arm上运行吗_IOS App能在Mac运行!苹果这黑科技能撼动微软吗?
  13. Mac(OS X)下的环境变量配置不生效解决办法
  14. Multisim12使用记录
  15. 计算机表格填充,Excel表格的自动填充功能
  16. 虚拟机Hyper-V的安装以及使用教程
  17. mysql数据库idb_数据库 - MysqliDb
  18. 安卓打开rpm文件_android打开文件及打开方式(打开程序列表) | 学步园
  19. kerboros协议讲解
  20. 不比不知道,主流商业云计算解决方案大比拼!

热门文章

  1. Python @staticmethod
  2. C/C++ 按行读取文件
  3. A-Graph Games_2019牛客暑期多校训练营(第三场)
  4. 修改myeclipse字体与操作系统的字体一致
  5. 2019年,50万大数据DT粉丝都爱的10本书
  6. 入门干货:Python操作Word文件经验分享
  7. 大数据解密之你的同事都跳槽到了哪些公司
  8. STM32之SPI从机DMA例程
  9. “元宇宙”是如何搞垮公司的?
  10. 是时候扔掉 Postman 了,Apifox 真香!