关于Array和List的区别(转载)

转载 2018年04月16日 01:34:53

Array、List的区别

Array—是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大

的,因为这需要重排数组中的所有数据

List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。


Array和List都属于顺序表。

    Array是一段连续的存储结构

int[] i=new int[3]

i其实记录的是数组的首地址,而i[1]其实相当于在i的地址的基础上加上1个整数的地址偏移,然后再取这块地址中的值。


    List则是不连续的存储结构,List的每个节点都有着一个Next属性,这个属性则记录着他的下一个节点的地址。
    也就是说当我们想找第100个节点的时候,他还是需要从第一个节点,然后做99次Next操作,才能找到list[99]节点。

在查找一个元素时时分别生成以下IL码

Array:

  IL_0020:  ldloc.0

  IL_0021:  ldc.i4.3

  IL_0022:  ldelem.i4

  IL_0023:  stloc.2

List:

  IL_0022:  ldloc.0

  IL_0023:  ldc.i4.3

  IL_0024:  callvirt   instance !0 class [mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)

  IL_0029:  stloc.2

  通过这两段IL,我只是希望证明List和Array对索引元素的方式是不同的。当然,我们无从知道Microsoft对List方法get_Item的实现。但是我们不难想象:

  因为List是一个链表,所以我需要从第一个元素开始逐个Next到所需索引的元素。这是一个耗时的过程。

 1. 从空间扩展角度上来说:

  数组必须要在初始化时分配固定的大小,比如说int[] a=new int[3];如果我们仅仅写int[] a=new int[];编译器就会无情地给我们报错。但是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<T>外的情况

当然,就查询某个值的速度而言,还是 Hashtable  或 Dictionary  最快,当然这两者和我们在讨论的东西,结构完全不相同,没有可比性。毕竟数组,是节约空间,而hash表是散列的,牺牲空间来换取速度


关于项目干系人

-
  • 1970年01月01日 08:00

C# Array和ArrayList,List区别

  • 2011年12月17日 01:28
  • 274KB
  • 下载

python中的list和array的区别

最近在学习机器学习,由于用到的是python,在进行数据处理时经常用到list和array类型,没有专门学过python,所以经常弄混,后来上网查了一下,它们的区别大致如下: 1 list是pyt...
  • MyHomeade
  • MyHomeade
  • 2017-04-22 10:18:11
  • 2222

Java中Array、List的区别

Array、List的区别 Array—是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大 的,...
  • u010525970
  • u010525970
  • 2016-08-31 09:50:24
  • 8014

Scala中Array和List的区别

Difference between Array and List in scala Q:什么时候用Array(Buffer)和List(Buffer)? A: Scala中的List是不可变的递...
  • power0405hf
  • power0405hf
  • 2015-12-09 14:03:49
  • 3999

Array, ArrayList, LinkedList之间的区别分析

(一)Array(数组类) Java中最基本的数据结构,提供动态创建和访问java数组的方法,根据定义的Array类型,其中的元素与类型必须相同。Array是一个固定大小的容器,底层采用的是线性连续...
  • y999666
  • y999666
  • 2016-05-25 22:04:18
  • 2937

Scala 中Array,List,Tuple的区别

Scala 中Array,List,Tuple的区别
  • dai451954706
  • dai451954706
  • 2015-06-26 11:01:34
  • 4181

java中vector,array,list,arraylist的区别

数组和其它容器的区别主要有三方面:效率,类型,和保存基本类型的能力.在Java中,数组是一种效率很高的存储和随机访问对象引用序列的方式.数组是一个简单的线性序列,因此访问速度很快,但也损失了其它一些特...
  • qq_33280890
  • qq_33280890
  • 2017-06-26 23:37:59
  • 434

python中的list和array的不同之处

python中的list和array的不同之处        python中的list是python的内置数据类型,list中的数据类不必相同的,而array的中的类型必须全部相同。在list中的...
  • liyaohhh
  • liyaohhh
  • 2016-04-04 09:51:41
  • 63874

javascript array list into setjavascript array list into set

  • 2009年08月22日 15:30
  • 380B
  • 下载
收藏助手
不良信息举报
您举报文章:关于Array和List的区别(转载)
举报原因:
原因补充:

(最多只允许输入30个字)