C#数组,ArrayList,List区别
共同点:都能存储一组对象
数组:在内存中时连续存储的,所以索引很快,赋值与修改元素很快,事件复杂度为O(1),折半查找法查找元素效率高。
增添删除元素的时候需要移动大量元素,因此提供了ArrayList对象
string[] s = new string[3];
s[0] = "a"; //赋值
s[0] = "a1"; //修改
ArrayList: 来自于命名空间System.Collections,他的大小时按照其中存储的数据来动态扩充与收缩的,所以我们在申明
ArrayList对象的时候不需要指定长度
ArrayList list = new ArrayList();
list.Add("abc"); //新增数据
list.Add("123");
list[2] = 345; //修改数据
list.RemoveAt(0); //移除数据
list.Insert(0,"hello C#"); //出入数据
注:我们看实例,在list中不仅插入了字符串还有数字,这样在ArrayList中插入不同类型的数据是不允许的。因为这样
ArrayList会把所有插入其中的数据都当作成object类型来处理。当我们使用ArrayList里的数据时会报类型不匹配错误。
但即使插入数据时保证数据类型一致,在使用时也要将他转化为对应的原类型来处理,带来性能损耗,这就是拆装箱。
装箱:就是把值类型的数据打包到引用类型的实例中。
int i = 123; object x = (object)i; //把值类型123赋给object类型的对象x
拆箱:从引用类型转变成值类型
object x = 123;int i = (int)x; //把引用类型123赋值给值类型的变量i
泛型List:由于ArrayList存在拆装箱的性能损耗,后来就有了泛型的概念
List<int> list = new List<int>();
list.Add(123); //添加数据
list.Add[0] =345; //修改数据
list.RemoveAt(0); //移除数据
注:上例中,我们插入string字符"helo,C#",IDE就会报错,避免了拆装箱的性能问题了。