专注

导航

面向对象基础-集合

我们在动物比赛报名的时候,是这样子做的:

 

   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其实就是不断的装箱和拆箱的工作,这是非常不好的事情。
要解决这个问题,我们需要用到的泛型。

posted on 2011-11-13 12:37  陈啊M  阅读(179)  评论(0编辑  收藏  举报