用list很久了,网上也查了很多资料,但是都不是很清楚,大家谈谈这两者之间的区别吧。最好从原理上来谈,比如说,怎么在内存中开辟空间,添加和删除元素的区别?

解决方案 »

  1.   

    用reflector看一下就明白了,list是基于array实现的
      

  2.   

    数组就是值对象,它存储数据元素类型的值的一系列位置.   
    Arraylist和list可以提供添加,删除,等操作的数据. 
    泛形中的元素类型是固定的. 
    比如: 
    arraylist   a   =   new   arraylist(); 
    a.add(1); 
    a.add( "aaaa "); 
    a.add(new   class()); 
    Arraylist中可以添加任何类型的元素. 如果定义的是泛形的话 
    List <MyClass>   myclasslist   =   new   List <MyClass> 
    MyClassList.add(new   MyClass()); 
    泛形中就不能再添加别的类型的.它只能添加MyClass类型的实例. 网上多查查
      

  3.   

    1.数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小, 
    但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的 
    2.数组要声明元素的类型,集合类的元素类型却是object. 
    3.数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。 
    4.数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。 
      

  4.   

    这个只是表象吧,而且楼主说的是 list<T> 和 数组 的区别,没有object和readonly的概念。
      

  5.   

    ArrayList 引用或值类型都强制转换为 Object。两都最大的区别是泛型的类型可自定义。
    ArrayList中存放的类型都是Object。
      

  6.   

    泛型其实就是长度可以变化的,并且类型固定的数组,相当于链表,但ArrayList存储的类型是object,使用时必须转化为实际的类型。泛型是知道具体类型的
      

  7.   

    瞎扯...谁告诉你的?哪个是值类型?6楼解释的比较清楚了...List<T>更灵活适用场景更多资源消耗更大,数组在结构比较固定的场景消耗更小...另外有些场景有设计限制,比如与COM或非托管程序或资源的交互很多时候必须使用数组...
      

  8.   

    答案经过vrhero把关就有内涵了。
      

  9.   

    我觉得数组的话效率会比list快
      

  10.   

    未必...假如结构不固定,需要经常更改数组维数那就要经常实例化新数组,效率反而低...所以说数组适用于结构较固定的场景...也因为如此,.NET为集合类提供了ToArray方法,又从3.5开始提供了IEnumerable的扩展方法ToList<T>,以便根据需要在数组与集合之间自由转换...
      

  11.   

    数组如果增加一项的话,必须现在内存中重新开辟一个空间,把前面的放过去,然后再加上追加的这一项。 数组适合定长的操作。但是list泛型增加一项在内存中又是怎么操作的呢?
      

  12.   

    如果你有认真看MSDN或者留意智能提示的话,List<T>有个Capacity属性,有个List<T>(int capacity)构造函数,还有个TrimExcess方法...多看MSDN,会增加你的理解并对你优化自己的代码有很大的帮助...
      

  13.   

    framework里的list其实就是封装了操作数组的方法...public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
    {
        private T[] _items;
        private int _size;    public List(int capacity)
        {
            if (capacity < 0)
            {
                ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
            }
            this._items = new T[capacity];
        }    public void Add(T item)
        {
            if (this._size == this._items.Length)
            {
                this.EnsureCapacity(this._size + 1);
            }
            this._items[this._size++] = item;
            this._version++;
        }}
      

  14.   

    arraylist 实际上里面放的是object,假设你放进去的是一个值类型,他会先把这个值类型转换成object(也就是进行一次装箱),取出来的时候一样进行一次拆箱,而list则不需要
      

  15.   

    List<T>泛型集合位于System.Collections.Generic;命名空间下。主要方法 :
    Add(T t):T代表的是该集合中允许存入的数据类型。利用Add(T t)方法将指定元素添加进List<T>集合。
    Remove(对象名):  通过对象名删除元素
    RemoveAt(索引):  通过索引删除元素
    Count:返回该集合中的元素的数量
    遍历循环
    foreach(int i = 0;i < list.Count;i ++)
    {
         T t = list[i];
    }
    foreach(T t in list)
    {
      //执行操作
    }
      

  16.   

    ArrayList集合可以存入任何类型的数据。存入后,将统一转变为Object类型,那么对于值类型来说,就是进行装箱操作,对应的,读取的时候,也要还原原来的类型,即拆箱操作。装箱和拆箱操作是非常消耗性能的。