数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单。
string[] s = new string[2];
s[0] = "a";
s[1] = "b";
但是数组存在一些不足的地方。在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,过段会造成数据溢出的错误。如果在声明数组时我们不清楚数组的长度,就会变得很麻烦。
ArrayList: 继承Ilist接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。
ArrayList list = new ArrayList();
//新增
list.Add("ad");
list.Add(123);
//修改数据
list[1] = 2;
//插入数据
list.Insert(0,"sfsd");
从上面的例子看,不仅插入了字符串,而且插入了数字,这样在ArrayList中插入不同类型是允许的。因为ArrayList会把所有插入其中的数据当做object类型处理。
很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索类型时通常发生装箱和拆箱的操作,带来很大的性能问题。
因为ArrayList存在类型不安全的特点,所以出现了泛型的概念。List是ArrayList类的泛型等效类,用法与ArrayList类似,因为List也继承IList接口。最大的区别是:
在声明List集合时,我们同时需要为List集合声明数据类型:
List<string> list = new List<string>();
//新增数据
list.Add("asd");
//修改数据
list[0] = "qwe";