最近才发现.net中有一个字符串留用的功能string.Intern(string something)。可以把认为经常出现的字符串放在一个内部哈希表,在这个哈希表中,key是字符串,value是对托管堆中的string对象的引用。。当再有相同字符串在程序中出现的时候,可以不为其分配因的内存,而是从哈希表中寻找此字符串,若哈希表中没有此字符串,则将其添加到哈希表中。
class Program { static List<string> result = new List<string>(); static List<string> randomString = new List<string>(); static Program() { randomString.Add("string1"); randomString.Add("string2"); randomString.Add("string3"); randomString.Add("string4"); randomString.Add("string5"); randomString.Add("string6"); randomString.Add("string7"); randomString.Add("string8"); randomString.Add("string9"); randomString.Add("string10"); } static Random random = new Random(); static void Main(string[] args) { for (int i = 0; i < 1000; i++) result.Add(GetString()); int s = random.Next(0, randomString.Count); int e = random.Next(0, randomString.Count); List<int> indexList=new List<int>(); for (int i = 0; i < result.Count; i++) if (result[i].Equals(randomString[s] + randomString[e])) indexList.Add(i); indexList.ForEach(x => { Console.WriteLine(Object.ReferenceEquals(result[indexList[0]], result[x])); }); Console.ReadKey(); } static string GetString() { int i = random.Next(0, randomString.Count); int j = random.Next(0, randomString.Count); return randomString[i] + randomString[j]; } }
运行结果如图所示
修改Main函数代码如下:
static void Main(string[] args) { for (int i = 0; i < 1000; i++) result.Add(string.Intern(GetString())); //添加字符串留用 ... }
运行结果如果所示
可见reult中相同的字符串引用了相同的引用
注:.Net4.0中对字符串常量默认使用了字符串留用,本例是在,Net4.0中运行的,所以使用了randomString[i] + randomString[j]变量添加到result中
原文:http://www.cnblogs.com/oldbig/p/3604440.html