C#集合List<T>你必须知道的事

1.关于索引

			int[] vs_int = { 1, 2, 3 };

            List<int> vs_list = new List<int>(vs_int);

            Console.WriteLine(vs_list[3]);	//在这句报错,报错信息:索引超出范围

此时List索引只能是0,1,2,不能是3。现在最大的索引是2;

总结:假如List里有i个单元,索引只能是0到i - 1,而C语言是可以索引到第i个索引的。

2.关于List分配的存储空间

			int[] vs_int = { 1, 2, 3 };

            List<int> vs_list = new List<int>(vs_int);

此时为List分配3个存储单元,这3个存储单元是从int[ ] vs_int拿到的。若我们再给List用Add添加东西:

int[] vs_int = { 1, 2, 3 };
List<int> vs_list = new List<int>(vs_int);
vs_list.Add(4);
vs_list.Add(5);
vs_list.Add(6);
Console.WriteLine(vs_list[5]);
Console.WriteLine(vs_list.Capacity);

输出:

6 //vs_list[5]的值
6 //List单元容量

但我们再用Add添加一个东西:

int[] vs_int = { 1, 2, 3 };

            List<int> vs_list = new List<int>(vs_int);

            vs_list.Add(4);
            vs_list.Add(5);
            vs_list.Add(6);
            vs_list.Add(7);

            Console.WriteLine(vs_list[6]);
            Console.WriteLine(vs_list.Capacity);

输出:

7 // vs_list[6]的值
12 //List单元容量

总结:每Add一个元素,索引可以自动+1。但容量有可能翻倍增长,比如初始3个单元,当Add第四个东西时,容量变为6,最高索引还是为0,1,2,3中的3。若一直Add到6+1 = 7个东西时,容量变为12。若在7的基础上继续Add(8),Add(9)…一直到Add(13)时,此时容量变为24…以此类推。

关于容量,几千几万的单位时一般无需注意,但若达到百万个单位时,比如400w整Add到40000001(400w)就翻倍成8000000(800w)个单位,这时你又用不了那么多,相当于多出来的3999999个单位都被浪费掉了。平时做一些对容量要求不苛刻的程序可以不用在意容量翻倍的事情。

另外容量翻倍的机制是若原来的List底层的数组空间不够了,会自动创建一个扩容两倍的数组,把之前的值拷贝到新的数组,这样会浪费性能,所以在一开始尽量估算与分配合适的容量。

3.关于查找与修改List单元的复杂度问题

List底层实现是数组,查找一个元素的时间复杂度为O(1),但删除一个元素的复杂度为O(n),所以不建议使用List做过多的删除工作。

4.clear,Remove等都不会影响容量

比如在初始3个单元的情况下,分别向List Add了1,2,3,4,5,6,7个数字,此时容量为12,RemoveAt(6)以后,也就是把数字7移除,容量还是7。若你的List因为扩容到了400w,clear操作以后仍占400w个空间。若你clear之后只打算用一小块空间,这时你应该考虑重新new一个合适的List。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值