设计模式学习笔记二:面向对象基础五之集合和泛型
数组
数组的优点:数组在内存中连续存储,可以快速而容易的从头到尾的遍历元素,可以快速的修改元素;缺点:创建时必须要指定数组变量的大小,还有就是两个元素之间添加元素比较困难。
集合
.net Framework提供了用于数据存储和检索的专用类,这些类统称集合。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。
ArrayList
ArrayList是命名空间System.Collections下的一部分,他是使用可用大小可按需动态增加的数组实现IList接口。
ArrayList的容量是ArrayList可以保存的元素数。ArrayList的默认初始容量为0,随着元素添加到ArrayList中,容量会根据需要通过重新分配自动增加。使用索引可以访问此集合中的元素。此集合中的索引从0开始。
动物叫声比赛ArrayList表示如下:
移除指定索引的集合:
小花和阿毛退赛:
装箱:就是把值类型打包到Object引用类型的一个实例中。
泛型
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所有存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所有存储的对象的类型占位符;类型参数作为其字段的类型和其方法的参数类型出现。
泛型集合需要System.Collections.Generic的命名空间。而List类是ArrayList类的泛型等效类。该类使用大小可按需动态增加的数组实现IList泛型接口。其实用法上关键就是在IList和List后面加'<T>',这'T'就是你需要指定的的集合的数据或对象类型。
通常情况下,都建议使用泛型集合。因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果几何元素为值类型,泛型集合类型的性能优于对应的非泛型集合类型(并优于从非泛型集合类型派生的类型),因为使用泛型是不必对元素进行装箱。
数组的优点:数组在内存中连续存储,可以快速而容易的从头到尾的遍历元素,可以快速的修改元素;缺点:创建时必须要指定数组变量的大小,还有就是两个元素之间添加元素比较困难。
集合
.net Framework提供了用于数据存储和检索的专用类,这些类统称集合。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。
ArrayList
ArrayList是命名空间System.Collections下的一部分,他是使用可用大小可按需动态增加的数组实现IList接口。
ArrayList的容量是ArrayList可以保存的元素数。ArrayList的默认初始容量为0,随着元素添加到ArrayList中,容量会根据需要通过重新分配自动增加。使用索引可以访问此集合中的元素。此集合中的索引从0开始。
动物叫声比赛ArrayList表示如下:
public class Match
{
//声明一ArrayList集合变量
ArrayList arrAnimal;
private string ShoutMatch()
{
string Result = "";
//实例化ArrayList对象,注意此时没有指定ArrayList大小
arrAnimal=new ArrayList();
//调用集合的Add方法添加对象,其参数的Object,所以new Cat和new Dog都没有问题
arrAnimal.Add(new Cat("小花"));
arrAnimal.Add(new Dog("阿毛"));
//集合的Count可以得到当前元素的数量
int AnimalCount=arrAnimal.Count;
foreach (Animal item in arrAnimal)
{
Result = Result + item.Shout()+";";
}
return Result;
}
}
{
//声明一ArrayList集合变量
ArrayList arrAnimal;
private string ShoutMatch()
{
string Result = "";
//实例化ArrayList对象,注意此时没有指定ArrayList大小
arrAnimal=new ArrayList();
//调用集合的Add方法添加对象,其参数的Object,所以new Cat和new Dog都没有问题
arrAnimal.Add(new Cat("小花"));
arrAnimal.Add(new Dog("阿毛"));
//集合的Count可以得到当前元素的数量
int AnimalCount=arrAnimal.Count;
foreach (Animal item in arrAnimal)
{
Result = Result + item.Shout()+";";
}
return Result;
}
}
移除指定索引的集合:
小花和阿毛退赛:
arrAnimal.RemoveAt(0);
arrAnimal.RemoveAt(1);
集合的变化是影响全局的,他始终要保证元素的连续性。所以上面的写法是错误的。正确的写法应该是:arrAnimal.RemoveAt(1);
arrAnimal.RemoveAt(0);
arrAnimal.RemoveAt(0);
ArrayList不是类型安全的。arrAnimal.RemoveAt(0);
装箱:就是把值类型打包到Object引用类型的一个实例中。
int i=123;
object o=(object)i;//boxing
拆箱:就是指从对象中提取值类型。object o=(object)i;//boxing
o=123;
i=(int)o;//unboxing
相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。其次,拆箱所需的强制转换也需要进行大量的计算。i=(int)o;//unboxing
泛型
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所有存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所有存储的对象的类型占位符;类型参数作为其字段的类型和其方法的参数类型出现。
泛型集合需要System.Collections.Generic的命名空间。而List类是ArrayList类的泛型等效类。该类使用大小可按需动态增加的数组实现IList泛型接口。其实用法上关键就是在IList和List后面加'<T>',这'T'就是你需要指定的的集合的数据或对象类型。
通常情况下,都建议使用泛型集合。因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果几何元素为值类型,泛型集合类型的性能优于对应的非泛型集合类型(并优于从非泛型集合类型派生的类型),因为使用泛型是不必对元素进行装箱。