字符串留用

最近才发现.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中

posted @ 2014-03-17 09:19  王老大  阅读(357)  评论(0)    收藏  举报