数组在内存中是连续存储的,因此它的索引速度很是快,并且赋值与修改元素也很简单。数组
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); string
//修改数据
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";