博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象基础-集合
阅读量:5267 次
发布时间:2019-06-14

本文共 1837 字,大约阅读时间需要 6 分钟。

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

 

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

转载于:https://www.cnblogs.com/chenamo5776/archive/2011/11/13/2247170.html

你可能感兴趣的文章
LeetCode(17) - Letter Combinations of a Phone Number
查看>>
路由器外接硬盘做nas可行吗?
查看>>
python:从迭代器,到生成器,再到协程的示例代码
查看>>
Java多线程系列——原子类的实现(CAS算法)
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>
HTML <select> 标签
查看>>
类加载机制
查看>>
tju 1782. The jackpot
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>