Array
定义:
public abstract class Array:ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuraEquatable
数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单
- string[] s = new string[3];
- //赋值
- s [0] = "a";
- s [1] = "b";
- s [2] = "c";
- //修改
- s [0] = "a1";
数组在俩数据中插入数据是很麻烦的,还有我们在声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。
ArrayList
ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.比如:
- ArrayList list = new ArrayList ();
- //新增数据
- list.Add ("abc");
- list.Add (123);
- //修改数据
- list [2] = 345;
- //移除数据
- list.RemoveAt (0);
- //插入数据
- list.Insert (0, "hello world");
ArrayList存在不安全类型与装箱拆箱的缺点:
在list中,我们不仅插入了字符串"abc",而且又插入了数字123。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。
List
List类是ArrayList类的泛型等效类(ArrayList继承了List接口)。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。
- List<int> list = new List<int>();
- //新增数据
- list.Add(123);
- //修改数据
- list[0] = 345;
- //移除数据
- list.RemoveAt(0);
拓展
ArrayList list1 = new ArrayList ();
这句创建了一个ArrayList的对象后把上溯到了List。此时list是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
问题就在于List有多个实现类,如LinkedList或者Vector等等,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢?,这时你只要改变这一行就行了:List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList list = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。如果没有特别需求的话,最好使用List list = new LinkedList(); 便于程序代码的重构. 这就是面向接口编程的好处。