c# 集合

本文深入探讨了集合在不同情况下的容量变化规律,包括未指定大小和指定大小的集合。详细解释了集合扩容机制,以及如何通过预先设定集合大小来避免频繁的内存重新分配,从而提高程序效率。同时,文章提供了集合类执行各种操作的性能评估,帮助读者理解集合在不同场景下的使用策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合适用于元素个数是动态的情况。

当使用默认的构造函数创建一个空列表后(未指定容量),集合的容量为0;当往集合内添加元素,容量将变为4*2^n(n为0或正整数)。当指定集合的大小为size后,容量将变为size*2^n(n为0或正整数)。

下面做了个小例子进行测试:

 Console.WriteLine("未指定大小的集合");
            List<int> li2 = new List<int>();//未指定大小的集合
            Printf(li2.Count, li2.Capacity);

            li2.Add(1);
            Printf(li2.Count, li2.Capacity);

            for (int i = 0; i < 4; i++)
                li2.Add(i);
            Printf(li2.Count, li2.Capacity);

            for (int i = 0; i < 4; i++)
                li2.Add(i);
            Printf(li2.Count, li2.Capacity);

            Console.ReadKey();

结果:

下面是指定大小的集合:

 const int Size = 10;

            List<int> li = new List<int>(Size); //指定大小的集合

            Printf(li.Count, li.Capacity);

            li.Add(1);
            li.Add(2);
            Printf(li.Count, li.Capacity);

            for (int i = 0; i < 10; i++)
                li.Add(i);
            Printf(li.Count, li.Capacity);

            for (int i = 0; i < 10; i++)
                li.Add(i);
            Printf(li.Count, li.Capacity);

            li.TrimExcess();//移除不需要的元素,只有当容量使用90%以上才执行
            Console.WriteLine("移除后:");
            Printf(li.Count, li.Capacity);
            Console.ReadKey();

当集合的容量不足以存储添加的元素时,集合的容量就会自动的扩大,整个集合就要分配到一个新的内存块中,通过重新分配内存,创建一个新数组,并调用Array.Copy()方法将旧数组的元素复制到新的数组中去,这个过程会耗费开销。好的习惯是创建一个足够大的集合,这样就节省了重新分配内存的过程。

集合类执行不同操作的性能:

注:O(1)表示无论集合中有多少数据项,这个操作需要时间都不变。

     O(n)表示对于集合中的每个元素,需要增加的时间量是相同的。

     O(log n)表示操作需要的时间随集合中元素的增加而增加,且每个元素需要增加的时间呈对数曲线。

 

转载于:https://www.cnblogs.com/dullfish/p/6109651.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值