数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如:
string[] s=new string[3];
//赋值
s[0]="a"; s[1]="b"; s[2]="c";
//修改
s[1]="b1";
但是数组也存在一些不足的地方,比如在两个数据中插入数据,还有我们在声明数组时必须指明数组的长度,过长会是的内存浪费,过短又会造成数据溢出,C#中最先提供了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好像是解决了所有的缺点,那么它就应该是完美的了,为什么C#2.0后又会出现List呢?
在list中,我们不仅插入了字符串“abc”,而且也插入了数字123。但是这样在ArrayList中是不允许的,因为ArrayList会将所有插入的数据都当做object处理。这样,在我们使用ArrayList中的数据时很可能会出现类型不匹配的错误,也就是说ArrayList不是类型安全的。即使我们在保证插入数据的时候都很小心,都有插入相同类型的数据,但在使用的时候,我们也需要将它转化为对应的类型来处理,这就存在了装箱和拆箱操作,会带来很大的性能损耗。
正是因为ArrayList存在不安全类型与装箱拆箱操作的缺点,所以在C#2.0后出现了泛型的概念。而List类是ArrayList类的泛型等效类。它的大部分用法都和ArrayList相似,因为List类也继承了IList接口。最关键的区别是,在声明List集合时,我们同时也需要为其声明List集合内数据的对象类型。比如:
List<int> list = new List<int>();
//新增数据
list.Add(123);
//修改数据
list[0] = 345;
//移除数据
list.RemoveAt(0);
同时,List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList可以被构造,
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();这句创建了一个ArrayList对象后把它上溯到了List,此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list = new ArrayList(),则是创建了一个保留了ArrayList所有属性和方法的对象。
List泛型的好处:通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从您转移给了编译器。不需要编写代码来检测数据类型是否正确,因为会在编译的时候强制我们使用相同类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。
来源:oschina
链接:https://my.oschina.net/u/3676955/blog/1931656