详解C#中List的扩容机制-创新互联

小编这次要给大家分享的是详解C#中List的扩容机制,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

创新互联服务项目包括宣汉网站建设、宣汉网站制作、宣汉网页制作以及宣汉网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,宣汉网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到宣汉省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

一:背景

1. 讲故事

在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到几百万甚至千万的大集合这个扩容机制还真的需要挖一下,免的入戏太深,难以自拔。

详解C#中List的扩容机制

二:List扩容机制

1. 如何查看

要想看它的扩容机制,可以用ILSpy去看看List的源码即可,非常简单。

详解C#中List的扩容机制

从源码的 int num = (_items.Length == 0) ? 4 : (_items.Length * 2) 可以非常清楚的看到,4个空间起步,后面都是 *2 的扩容,也就说当你有 2^(n-1) + 1 个元素,实际上你需要占用 2^n个空间。

下面我用C#代码演示一下:

 static void Main(string[] args)
 {
  var list1 = Enumerable.Range(0, (int)Math.Pow(2, 22)).ToList();

  var list2 = new List(list1);
  list2.Add(1);

  Console.WriteLine($"list1.Capacity={list1.Capacity}");
  Console.WriteLine($"list2.Capacity={list2.Capacity}");

  Console.ReadLine();
 }

 ------ output -------

list1.Capacity=4194304
list2.Capacity=8388608

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:详解C#中List的扩容机制-创新互联
地址分享:http://myzitong.com/article/dcsgpg.html