泛型集合类

数组的优点:数组在内存中连续存储,因此可以快速而容易地从头到尾遍历元素,可以快速修改元素等;

数组的缺点:创建时必须指定数组变量的大小,而且在两个元素之间添加元素也比较困难。

.NET Framework 提供了用于数组存储和检索的专用类,这些类统称集合。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。

ArrayList 是命名空间 System.Collections 下的一部分,它是使用大小可按需动态增加的数组实现 IList 接口。

ArrayList 的容量是 ArrayList 可以保存的元素数。ArrayList 的默认初始容量为 0。随着元素添加到 ArrayList 中,容量会根据需要通过重新分配自动增加。使用整数索引可以访问此集合中的元素。此集合中的索引从零开始。也就是说,数组的容量是固定的,而ArrayList 的容量可根据需要自动扩充。

 1 using System.Collections;
 2 
 3 public partial class Form1 : Form
 4 {
 5   // 声明一集合变量
 6   IList arrayAnimal;
 7 
 8   // 实例化 ArrayList 对象,并不指定大小
 9   arrayAnimal = new ArrayList();
10 
11   // 集合的 Add 方法其参数是 object
12   arrayAnimal.Add(new Cat(" "));
13   arrayAnimal.Add(new Dog(" "));
14 
15   MessageBox.Show(arrayAnimal.Count.ToString());
16 
17   // 遍历集合
18   foreach(Animal item in arrayAnimal)
19   {
20     MessageBox.Show(item.Shout());
21   }
22 }

 ArrayList 中所有元素都是object,不是类型安全的。另外, ArrayList 对于存放值类型的数据,比如int、string 型或者结构 struct 的数据,用 ArrayList 就意味着都需要将值类型装箱为object对象,使用集合元素,还需要执行拆箱操作,这就带来很大的性能损耗。

// 所谓装箱就是把值类型打包到 Object 引用类型的一个实例中
int i = 123;
object o = (object) i;
// 所谓拆箱就是指从对象中提取值类型
o = 123;
i = (int)o;

相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。其次,拆箱所需的强制转换也需要进行大量的计算。

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。

 1 // 泛型集合命名空间
 2 using System.Collections.Generic;
 3 
 4 public partial class Form1 : Form
 5 {
 6   // 声明一泛型集合变量,IList<Animal>表示此集合只能接受Animal 类型。
 7   IList<Animal> arrayAnimal;
 8 
 9   // 实例化 ArrayList 对象,并不指定大小
10   arrayAnimal = new List<Animal>();
11 
12   // arrayAnimal.Add("") 则报错
13   arrayAnimal.Add(new Cat(" "));
14   arrayAnimal.Add(new Dog(" "));
15 
16   MessageBox.Show(arrayAnimal.Count.ToString());
17 }

【总结】

List 和 ArrayList 在功能上是一样的,不同之处在于,List 在声明和实例化时都需要指定其内部项的数据或对象类型,这就避免了刚才讲的类型安全问题和装箱拆箱问题了。

通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱。

泛型是集 ArrayList 集合和 Array 数组优点于一身。

posted @ 2015-06-24 21:11  壬子木  阅读(195)  评论(0)    收藏  举报