关于String暂存池(常量池)

string作为最常用的类型,在实际项目中会有大量的字符串操作,这样会带来大量的字符串创建,内存分配、回收,进而影响性能。因此CLR对于string进行了特殊的优化,CLR中存在“字符串暂存池”概念。那么CLR 如何做到的呢?在CLR初始化时创建一个内部的哈希表,这个表相当于一个字典表,键就是字符串,值是指向托管堆中该字符串对象的引用。(具体详看原文链接:https://blog.csdn.net/xiaouncle/article/details/87832198)

以下内容由原文得到:

红色部分代表进行比较的变量

不是所有的字符串都放在暂存池中,以下三种情况会查询暂存池(若查询不到就将其存入暂存池)(引用地址相同):

利用字面量值创建string对象:

//String str1 = “999”;String str2 = “999”;

利用string.Intern()创建string对象:

//StringBuilder sb1 = new StringBuilder(“99999”);string str1 = “99999”;string str2=string.Intern(sb1.ToString);

字面量值+字面量值拼接创建string对象:

//sb1 = “99”;sb2=”999”;str1=”999”;str2=”99”;sb1+str1;sb2+str2;

所以不会查询暂存池的情况有(引用地址不同):

str.Tostring();

//str1=”999”;str2=str1.ToString();

char[].ToString();

//str1=”999”;char[] charArray=str1.ToArray();str2=charArray.ToString();

new String();

//(1)str1=”999”;char[] charArray = str1.ToArray();string str2 = new string(charArray);string str3 = new string(charArray);

字面量值+非字面量值

//char[] charArray = {‘9’,’9’};str1 = “99999”;str2 =”999”+charArray.Tostring();

非字面量值+非字面量值

//char[] charArray1 = {‘9’,’9’};char charArray2 = {‘9’,’9’,’9’};

str1 =”99999”;str2=charArray1.ToString()+charArray2.ToString();

上一篇:Array sort


下一篇:把字符串转换成整数