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();