C#(面向对象基础数组VS集合VS范型)下-2

键人寄语:终于知道好多电视剧,为什么大结局还要分个上、中、下了。因为一次真的写不完呀~~抓狂,接着写奋斗

一集合(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>}

泛型的优点:可以直接获得安全类型,泛型类型的性能通常优于对应的非泛型集合类型,因为使用泛型是不必对元素进行装箱。所以通常情况下都建议使用泛型。





猜你喜欢

转载自blog.csdn.net/u013034828/article/details/41923967
今日推荐