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