面向对象基础-集合
我们在动物比赛报名的时候,是这样子做的:
1: private Animal[] arrayAniaml;
2: private void button2_Click(object sender, EventArgs e)
3: {
4: arrayAniaml = new Animal[5];
5: arrayAniaml[0] = new Cat("mao1");
6: arrayAniaml[1] = new Dog("gou1");
7: arrayAniaml[2] = new Cat("mao2");
8: arrayAniaml[3] = new Cat("mao3");
9: arrayAniaml[4] = new Dog("gou2");
10: }
其实这样子很不好,首先,我们创建数组的时候,指定了大小5,然后,如果,我们要从两个元素中间加一个元素比较困难。.NetFrameWork提供了用于数据存储和检索的专用类,这些类统称为结合,这些类提供堆栈、队列、列表和哈希表的支持,大多数集合类实现相同的接口。最常用的ArrayList。
ArrayList是命名空间System.Collections下的一部分,它是使用大小可以按需动态增加的数组实现IList接口。
1: IList arrayAnimal;
2: private void button2_Click(object sender, EventArgs e)
3: {
4: arrayAnimal = new ArrayList();
5: arrayAnimal.Add(new Cat("mao1"));
6: arrayAnimal.Add(new Cat("gou1"));
7: arrayAnimal.Add(new Cat("mao2"));
8: arrayAnimal.Add(new Cat("mao3"));
9: arrayAnimal.Add(new Cat("gou4"));
10: }
上面改进的代码表面上看,没有什么太大的不同;但是,如果由于某些原因,gou1不能参加比赛了,那么怎么办了?
我们可以通过arrayAnimal.RemoveAt(1)实现。需要注意的是,这个时候,arrayAnimal(1)就变成了mao2了,因为RemoveAt影响是全局的,他始终保重元素的连续性。
这样子我们可以随意的添加,插入或者移去某一范围的元素,比数组方便多了。
但是ArrayList不管什么对象都可以接受,因为所有的元素都是Object,比如,我们就是arrayAnimal.add(123)或者arrayAnimal.add("helloWorld"),这个时候程序编译时是没有问题的,但是在执行的时候,foreach (Animal item in arrayAnimal)就会报出此处有错误,因为类型不匹配。也就是说ArrayList不是类型安全的。
还有,ArrayList对于存放值类型的数据,比如int,string或者struct的数据,用ArrayList就意味着需要将值类型装箱为Object对象,使用集合元素时,还需要执行拆箱操作,这就带来很多性能损耗。
装箱和拆箱可以这样子理解:
装箱就是把值类型打包成Object引用类型的一个实例中。
int i = 123;
object o = (object) i;//装箱
拆箱就是从对象中提取值类型。
o =123;
i = (int) o;//拆箱;
所以,ArrayList其实就是不断的装箱和拆箱的工作,这是非常不好的事情。
要解决这个问题,我们需要用到的泛型。