仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1153|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET教程之.NET,你健忘了么?(三)――关于Array和List的利用仓酷云

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过net网页编程比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。系列文章目次索引:《.NET,你健忘了么
之前,一向在谈.NET框架方面的成绩,明天来谈谈关于Array和List的利用成绩,这应当算是属于算法的最基本的工具了。只是提示人人对这个成绩略加注重。
写这个是由于一个同砚的乞助,事变是如许的,他往卖力公司的一个培训模块,在培训模块中,有一个功效是主动成卷。然后,我们会很简单地想到洗牌算法。因而我给他也许注释了洗牌算法的历程和步骤,然后他给出了如许的代码,还很自满地告知我,他利用了泛型……
  1. List<int>list=newList<int>();for(inti=0;i<10;i++){list.Add(i);}Randomr=newRandom();for(intj=0;j<100;j++){inttemp;intx1=r.Next(10);intx2=r.Next(10);temp=list[x1];list[x1]=list[x2];list[x2]=temp;}
复制代码
我坦率地告知他,他这个办法欠好,然后写下了上面的代码:
  1. int[]array=newint[10];for(inti=0;i<10;i++){array[i]=i;}Randomr=newRandom();for(intj=0;j<100;j++){inttemp;intx1=r.Next(10);intx2=r.Next(10);temp=array[x1];array[x1]=array[x2];array[x2]=temp;}
复制代码
他很不屑地对我说,不是都一样么!并且还在以利用了泛型为豪!我无语……
我仅仅把List(链表)换成了Array(数组),有人会说,如许的干系年夜么?
让我们先来复杂地回忆一下基本常识。
Array和List都属于按次表。
Array是一段一连的存储布局,如int[]i=newint[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:callvirtinstance!0class[mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)
IL_0029:stloc.2
我们能够发明,固然他们的写法是一样的,可是在IL中却有着很年夜的不同。
经由过程这两段IL,我只是但愿证实List和Array对索引元素的体例是分歧的。固然,我们无从晓得Microsoft对List办法get_Item的完成。可是我们不难设想:
由于List是一个链表,以是我必要从第一个元素入手下手逐一Next到所需索引的元素。这是一个耗时的历程。
因而,在利用洗牌算法时,利用List是个很低劣的做法。再进一步说,当我们必要大批的索引步骤时,利用List是个很低劣的做法。
那List和Array各自应当用在甚么情形下呢?我来做个复杂的总结:
1.从空间扩大角度下去说:
数组必需要在初始化时分派流动的巨细,好比说int[]a=newint[3];假如我们仅仅写int[]a=newint[];编译器就会无情地给我们报错。可是List因为空间不用一连,以是不必指定初始巨细。
总结1:当不断定巨细时,最好利用List取代Array。
2.从操纵角度下去看:
关于索引这个就不赘述了。
总结2:当必要大批的查找操纵时,最好利用Array。
关于拔出(删除)操纵,良多人是从拔出(删除)的工夫上剖析,说List优于Array,我以为是分歧理的。
更公道的注释应当是从两个角度剖析(以拔出为例):
<1>指定地位拔出指定元素:
关于Array讲,有两套办理计划:
A.利用一个新数组,N+1个元素从头赋值的历程。一个for轮回,工夫庞大度O(n)。
B.在原数组上操纵,那末起首必要为该数组预留空间,这是个很难办的事变。并且厥后续元素的挪动泯灭工夫庞大度仍未O(n)。
关于List来说,良多人说庞大度就是O(1)。这实际上是分歧理的,由于List拔出元素当然简单,可是在指定地位的拔出,必要一个工夫庞大度为O(n)的查找历程。
可是只思索工夫庞大度是不敷的,我们要思索整体的情形。假如利用新数组,不但华侈了新的空间,并且必要重复的赋值历程,是N+1次。假如不利用新数组,预留空间其实太贫苦,因而综上所述,仍是List好。
增补下:良多同事和伴侣都问我,说为何要学那末多的排序和搜刮算法,排序学个疾速排序,搜刮学个二分搜刮,如许就够了呗!可是我想说的是,所说的最快,不外是他们的均匀(或最坏)情形下的工夫庞大度,其实不能代表通用的情形,我们在实践事情中,仍是要依据实践情形往选择最合用的算法,这就是我们进修良多算法的目标
<2>给出前一个节点,然后在前面拔出元素。这个我的意义就是不单单给出了PreviousNode的Value,还给出了他的Next。这个情形我就不空话了,List的上风太年夜了。但是在实践情形中,这类情形的大概性几近为零。
因而,总结3:当必要举行频仍的拔出,删除操纵时,最好利用List取代Array。
别的,给出个不太主要的增补,因为List必要存储他下一个节点的地点,以是List比Array绝对起来华侈了更多的空间。
续:
在上文中,我对List<T>的了解年夜错特错,在成文前,起首做下自我品评,然后也对酿成的不良影响暗示报歉。
起首入手下手的就是对List的从头认知。在这里,让我们先从机关办法来从头熟悉List<T>的实质,先来看下上文中我所粘出的代码:
  1. List<int>list=newList<int>();for(inti=0;i<10;i++){list.Add(i);}Randomr=newRandom();for(intj=0;j<100;j++){inttemp;intx1=r.Next(10);intx2=r.Next(10);temp=list[x1];list[x1]=list[x2];list[x2]=temp;}
复制代码
  1. 在上文中,我对这个List多量特批,如今,我们来从头看下这个List的机关:
复制代码
  1. publicList(){this._items=List<T>._emptyArray;}
复制代码
先来看无参的机关办法,当无参的时分,.NETFramework实际上是用一个_emptyArray来初始化了List中的items汇合。那末_emptyArray又是甚么呢?我们持续向下看:
  1. privatestaticT[]_emptyArray;
复制代码
恩,他是一个静态字段,然后我们看下List<T>的静态机关办法:
  1. staticList(){List<T>._emptyArray=newT[0];}
复制代码
我们看到,_emptyArray实际上是一个T范例的数组,个数为0。那末也就是说,当我们实行0参数的机关办法时,体系是把items汇合给赋值为了一个T范例的个数为0的数组。
那末items又是甚么?我们持续向下看:
  1. publicvoidAdd(Titem){if(this._size==this._items.Length){this.EnsureCapacity(this._size+1);}this._items[this._size++]=item;this._version++;}
复制代码
这是List<T>中一个Add(Titem)办法,可是我们能够从办法中敲出些眉目来。
在这里,我并非想注释这个办法的道理,只是想说,在List中,实在保护这一个items,然后良多操纵,是基于items的操纵。
恩,以是在上文中,List<int>list=newList<int>();和Arraya=newint[10]();的操纵实在不同其实不年夜。
我们一定还记得在《EffectiveC#》中有如许一条划定规矩,就是说:在初始化List之前最好对List初始化巨细。
让我们从源码中来找到这一条划定规矩的谜底。
  1. privatevoidEnsureCapacity(intmin){if(this._items.Length<min){intnum=(this._items.Length==0)?4:(this._items.Length*2);if(num<min){num=min;}this.Capacity=num;}}
复制代码
我们来看,在这个办法体中,List会新建一个数组,然后把数组的长度设置为本来的二倍(假如原本的数组长度为0,那就默许将数组的长度设置为4)。
因而,这类,让List的办法本人往挪用EnsureCapacity(intmin)办法,不但华侈了机关数组的工夫,还华侈了大批的空间(由于将原本的数组空间扩大了二倍)。
因而,请记得:在初始化List之前最好指定List的巨细。
为了证实上述的概念,我们再来任意看一些代码:
  1. publicintIndexOf(Titem){returnArray.IndexOf<T>(this._items,item,0,this._size);}
复制代码
  1. int[]array=newint[10];for(inti=0;i<10;i++){array[i]=i;}Randomr=newRandom();for(intj=0;j<100;j++){inttemp;intx1=r.Next(10);intx2=r.Next(10);temp=array[x1];array[x1]=array[x2];array[x2]=temp;}0
复制代码
由下面的代码,我想证实的是:实在List<T>不外是对Array的进一步封装,说得再间接点,我乐意了解List<T>为Array的可扩大版本,然后扩大了一些办法;
那关于Array和List的选择,我从头做一个申明:
List是基于Array存在的,因而,在创立一个List对象时,必要泯灭比Array绝对更多的工夫,和更年夜的空间,由于List除初始化外部的items外还必要初始化一些其他的属性。并且在办法挪用时,这点我没有证明,只是一个推测,List必要的是再往挪用Array的相干办法,因而大概会存在办法挪用的工夫损耗成绩。
因而,我的倡议是:
假如初始化时断定巨细,那末就利用Array。
假如初始化时不断定巨细,那末就利用List。固然,实在完整能够本人往完成List中的数组扩大功效的,大概会更棒,由于我们没有需要往将Array每次都扩大为本来的二倍。
别的的增补,Array相对List另有个上风就是:多维数组比List的嵌套更简单了解,也就是说int[][](大概是int[,])要强于List>,也就说在范例断定且多维的情形下,用Array要优于List。
本文来自:http://www.ckuyun.com/xinyuperfect/archive/2009/03/05/1403578.html和http://www.ckuyun.com/xinyuperfect/archive/2009/03/09/1406657.html
在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。
admin 该用户已被删除
9#
发表于 2015-3-23 07:09:00 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
8#
发表于 2015-3-16 23:53:11 | 只看该作者
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
莫相离 该用户已被删除
7#
 楼主| 发表于 2015-3-9 14:55:29 | 只看该作者
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
只想知道 该用户已被删除
6#
发表于 2015-3-4 14:05:11 | 只看该作者
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
老尸 该用户已被删除
5#
发表于 2015-2-15 21:37:57 | 只看该作者
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-6 09:17:05 | 只看该作者
能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
爱飞 该用户已被删除
板凳
发表于 2015-1-30 08:56:51 | 只看该作者
提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。
小魔女 该用户已被删除
沙发
发表于 2015-1-21 05:39:46 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 22:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表