Array和List的使用.pdfVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Array和List的使用

写这个是因为很多人都会遇到这个问题,很多负责公司一个培训模块的朋友,在培训模块中, 有一个功能是自动成卷。然后,我们会很容易地想到洗牌算法。于是我给他大概解释了洗牌 算法的过程和步骤,然后他给出了这样的代码,还很骄傲地告诉我,他使用了泛型…… 杨中科老师点评:这个知识点是很多企业面试、笔试的时候会问的问题,需要格外注意,无 论是C#、Java 、C++还是其他语言都会有同样的问题,因为“数据结构不分语言”。 1. Listint list = new Listint(); 2. for (int i = 0; i 10; i++) 3. { 4. list.Add(i); 5. } 6. Random r = new Random(); 7. for (int j = 0; j 100; j++) 8. { 9. int temp; 10. int x1 = r.Next(10); 11. int x2 = r.Next(10); 12. temp = list[x1]; 13. list[x1] = list[x2]; 14. list[x2] = temp; 15. } 16. 复制代码 这种写法不是太好,然后写下了下面的代码: 1. int[] array = new int[10]; 2. for (int i = 0; i 10; i++) 3. { 4. array[i] = i; 5. } 6. Random r = new Random(); 7. for (int j = 0; j 100; j++) 8. { 9. int temp; 10. int x1 = r.Next(10); 11. int x2 = r.Next(10); 12. temp = array[x1]; 13. array[x1] = array[x2]; 14. array[x2] = temp; 15. } 16. 复制代码 我仅仅把List(链表)换成了Array(数组),有人会说,这样的关系大么? 让我们先来简单地回顾一下基础知识。 Array 和List 都属于顺序表。 Array 是一段连续的存储结构,如int[] i=new int[3],i 其实记录的是数组的首地址,而i[1]其 实相当于在i 的地址的基础上加上1 个整数的地址偏移,然后再取这块地址中的值。也就是 相当于*(i[0]+4); 而List 则是不连续的存储结构,List 的每个节点都有着一个Next 属性,这个属性则记录着他 的下一个节点的地址。也就是说当我们想找第100 个节点的时候,他还是需要从第一个节点, 然后做99 次Next 操作,才能找到list[99]节点。这是个蛮痛苦的过程。 很多人会说,那无论是List 还是Array,不都是一个索引么!让我们来请出IL: 先来看Array 查找某个元素的IL: IL_0020: ldloc.0 IL_0021: ldc.i4.3 IL_0022: ldelem.i4 IL_0023: stloc.2 然后让我们来看下List 查找某个元素的IL: IL_0022: ldloc.0 IL_0023: ldc.i4.3 IL_0024: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1int32::get_Item(int32) IL_0029: stloc.2 我们可以发现,虽然他们的写法是一样的,但是在IL 中却有着很大的差别。 通过这两段IL,我只是希望证明List 和Array 对索引元素的方式是不同的。当然,我们无从 知道Microsoft 对 List 方法get_Item 的实现。但是我们不难想象: 因为List 是一个链表,所以我需要从第一个元素开始逐个 Next 到所需索引的元素。这是一 个耗时的过程。 因此,在使用洗牌算法时,使用List 是个很差劲的做法。再进一步说,当我们需要大量的索 引步骤时,使用List 是个很差劲的做法。 那List 和Array 各自应该用在什么情况下呢?我来做个简单的总结: 1. 从空间扩展角度上来说: 数组必须要在初始化时分配固定的大小,比如说 int[]

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档