当前位置:编程学习 > C#> 正文

数组、ArrayList和List的区别

时间:2014-9-4类别:编程学习

数组、ArrayList和List的区别

数组、ArrayList和List的区别

一、数组

 

1、数组在内存中是连续存储的,所以它的索引速度是非常的快,赋值与修改元素也很简单,但是在数组的两个数据间插入数据也是很麻烦的

2、在声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。

3、如果在声明数组时我们并不清楚数组的长度,就变的很棘手了。

4、数组定义时要写明类型,是字符串还是整形 

 

例如

  •  
  • C# 代码   复制
  • 
    string[] s=new string[3];
    //赋值
    s[0]="a";
    s[1]="b";
    s[2]="c";
    //修改
    s[1]="b1";
    
    		
  •  

     

    二、ArrayList

     

    1、ArrayList就是动态数组,可以动态的增加和减少元素。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。

    2、ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.

    3、可以存放任何类型的变量

    4、ArrayList存在不安全类型与装箱拆箱

     

    例如

  •  
  • C# 代码   复制
  • 
    ArrayList list = new ArrayList();
    //新增数据
    list.Add("abc");
    list.Add(123);
    //修改数据
    list[2] = 345;
    //移除数据
    list.RemoveAt(0);
    //插入数据
    list.Insert(0, "hello world");
    
    		

  • 在上例list中,我们不仅插入了字符串"abc",而且又插入了数字123。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。

     

    5、ArrayList与数组转换

     

  • C# 代码   复制
  • 
      ArrayList List = new ArrayList();
    List.Add(1);
    List.Add(2);
    List.Add(3);
    
    Int32[] values = (Int32[])List.ToArray(typeof(Int32));
    
    
    ArrayList List = new ArrayList();
    List.Add( “string” );
    List.Add( 1 );
    //往数组中添加不同类型的元素
    
    object[] values = List.ToArray(typeof(object)); //正确
    string[] values = (string[])List.ToArray(typeof(string)); //错误
    
    		


  • 和数组不一样,因为可以转换为Object数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。

     

     

    三、List

     

    List类是ArrayList类的泛型等效类。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。

    例如

  •  
  • C# 代码   复制
  • 
    List<int> list = new List<int>();
    //新增数据
    list.Add(123);
    //修改数据
    list[0] = 345;
    //移除数据
    list.RemoveAt(0);
    
    		

  • 上例中,如果我们往List集合中插入string字符"hello world",IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。
     

    上一篇下一篇

    猜您喜欢

    热门推荐