键人寄语:终于知道好多电视剧,为什么大结局还要分个上、中、下了。因为一次真的写不完呀~~,接着写
一集合(ArrayList)
集合与数组很像,就是可以储存多个变量或对象。
数组的优点:数组在内存中连续存储,可以快速而容易地从头到尾遍历元素,可以快速修改元素等等。
数组的缺点:创建时必须要指定数组变量的大小,还有在两个元素之间添加元素也比较困难。
集合弥补了数组的缺点,首先ArrayList是命名空间System.Collentions下的一部分,它是使用大小可按需要动态增加的数组实现IList接口。
ArrayList的容量是ArrayList可以保存的元素数。ArrayList的默认初始容量为0.随着元素添加到ArrayList中,容量会根据需要通过重新分配自动增加。使用整数索引可以访问此集合中的元素。此集合中索引从零开始。简单来说就是动态增加。
用代码来说明一下:
数组代码:
private Animal[] arrayAnimal;
//声明一个动物数组
//“动物报名”的按钮事件
private void button3_Click(object sender, EventArgs e)
{
arrayAnimal = new Animal[5];//实例化最多可报名5个的动物数组对象
arrayAnimal[0] = new Cat("小花");
arrayAnimal[1] = new Dog("阿毛");
arrayAnimal[2] = new Dog("小黑");
arrayAnimal[3] = new Cat("娇娇");
arrayAnimal[4] = new Cat("咪咪");//报名的分别是猫、狗、狗、猫、猫
}
//“叫声比赛“的按钮事件
private void button4_Click(object sender, EventArgs e)
{
foreach (Animal item in arrayAnimal)//遍历这个数组,让它们都Shout()
{
MessageBox.Show(item.Shout());//由于有了多态性,所以叫的时候,程序会自动去找item是什么对象,然后用哪个重写方法
}
}
集合代码:
首先
using System.Collections ;//增加此命名空间
然后
IList arrayAnimal;//声明一个集合变量,可以用接口IList,也可以直接声明“ArrayList arrayAnimal;”
//“动物报名”的按钮事件
private void button3_Click(object sender, EventArgs e)
{
arrayAnimal = new ArrayList ();//实例化ArrayList对象,注意,此时并没有指定arrayAnimal的大小,这与数组并不相同
arrayAnimal.Add ( new Cat("小花"));//调用集合的Add方法增加对象,其参数是Object,所以new cat和new dog都没有问题
arrayAnimal.Add ( new Dog("阿毛"));
arrayAnimal.Add ( new Dog("小黑"));
arrayAnimal.Add ( new Cat("娇娇"));
arrayAnimal.Add ( new Cat("咪咪"));
MessageBox.Show(arrayAnimal.Count.ToString());//随着Add对象增加,集合的Count可以得到当前的元素个数
arrayAnimal.RemoveAt(1);
arrayAnimal.RemoveAt(2);//阿毛和小黑要退出比赛,所以移除他们,但这样处理不能满足需求!?RemoveAt方法,它的作用是移除指定索引处的集合项。
}
//“叫声比赛“的按钮事件
private void button4_Click(object sender, EventArgs e)
{
foreach (Animal item in arrayAnimal)//此时遍历的是ArrayList集合,而非数组
{
MessageBox.Show(item.Shout());//由于有了多态性,所以叫的时候,程序会自动去找item是什么对象,然后用哪个重写方法
}
}
运行此时点”动物报名“按钮会显示5,叫声比赛也会显示小花,小黑,咪咪;但并不是要求的阿毛和小黑退出比赛。这里需要注意的是移除阿毛之后,小黑的序号将自动减去一,也就是代码应该改为
arrayAnimal.RemoveAt(1);
arrayAnimal.RemoveAt(1);
集合的优点:可以根据使用大小按需动态增加,不用受事先设置其大小的控制。还有就是可以随意的添加、插入或移除某一范围的元素,比数组要方便。
集合的缺点:ArrayLis不管你是什么对象都是接受的,因为在它的眼里所有的元素都是Object。如果你输入的类型不匹配时,它也不会报错。ArrayList集合在使用值类型数据时,其实就是在不断地做装箱和拆箱的工作,这显然是非常糟糕的事情。因为装箱和拆箱是耗资源和时间的。
下面说一下装箱和拆箱:
拆装箱就是识别数据类型的过程。
装箱:就是把值类型打包到Object引用类型的一个实例中。在这里我们把对象0看做一个箱子,整型变量i被”装箱“,并赋值给对象O。
int i = 123;
object O = (object)i;//boxing(装箱)
拆箱:就是指从对象中提取值类型。此例中对象O拆箱并将其赋值给整型变量i
O = 123;
i = (int)O;//unboxing(拆箱)
为了解决这一问题,就提出了泛型。
二、泛型(List)
泛型:是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。这是MSDN上的说法,简单来说其实占位符就是给集合成员规定Type(类型)。而且在使用时必须规定类型参数。
首先
using System.Collections.Generic;//增加泛型集合命名空间
然后
IList<Animal > arrayAnimal;//关键就在这里,声明一泛型集合变量,用接口IList,注意:IList<Animal>表示此集合变量只能接受Animal类型,其他不可以。也可以直接声明“List<Animal> arrayAnimal”
//“动物报名”的按钮事件
private void button3_Click(object sender, EventArgs e)
{
arrayAnimal = new List <Animal>();//实例化List对象,注意,此时也需要指定List<T>的‘T’是Animal
arrayAnimal.Add ( new Cat("小花"));//调用集合的Add方法增加对象,其参数是Object,所以new cat和new dog都没有问题
arrayAnimal.Add ( new Dog("阿毛"));
arrayAnimal.Add ( new Dog("小黑"));
arrayAnimal.Add ( new Cat("娇娇"));
arrayAnimal.Add ( new Cat("咪咪"));
MessageBox.Show(arrayAnimal.Count.ToString());//随着Add对象增加,集合的Count可以得到当前的元素个数
<span style="white-space:pre"> </span>}