赞
踩
一、数组
1、概念
对于数组,相信我们大家都很熟悉了,它是一种数据结构,其中包含许多通过计算索引访问的变量。 数组中的变量(亦称为数组的元素)均为同一种类型,我们将这种类型称为数组的元素类型。
同时我们也要知道,数组的类型是引用类型,声明数组变量只是为引用数组实例预留空间。 实际的数组实例是在运行时使用 new 运算符动态创建而成。 new 运算指定了新数组实例的长度,然后在此实例的生存期内固定使用这个长度。 数组元素的索引介于 0 到 Length - 1 之间。 new 运算符自动将数组元素初始化为其默认值(例如,所有数值类型的默认值为 0,所有引用类型的默认值为 null)。
不仅如此,数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单。
2、示例
- //数组
- string[] str=new string[2];
- //赋值
- str[0]="a";
- str[1]="b";
- //修改
- str[1]="a1";
3、反思
看到这里,相信大家已经发现了数组的不足之处,当然这个在我们数组的概念中也有体现。也就是说我们的数组在实例化时,必须指定长度,那么此数组的生存期内,将固定使用这个长度。相信到这里,我们大家就会发现,如果数组定义太长就会造成内存浪费,定义太短就会造成数据溢出的错误。那么当我们在声明数组时,可能并不清楚数组的长度,此时问题就变的很棘手了。
不仅如此,我们的数组空间是连续,这也导致了存储效率低,插入和删除元素效率比较低,而且麻烦。如果,要增添一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样,你想删除一个元素,需要移动大量元素去填补被移动的元素。
针对数组的这些缺点,C#中最先提供了ArrayList对象来克服这些缺点。
1、概念
ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。
2、示例
- //ArrayList
- ArrayList list = new ArrayList();
- //新增数据
- list.Add("world");
- list.Add(5678);
- //修改数据
- list[2] = 34;
- //移除数据
- list.RemoveAt(0);
- //插入数据
- list.Insert(0, "hello");
3、反思
从上面这个例子,我们大家可以看出,它解决了数组中的所有缺点。它实现了存储的数据动态扩充与收缩,故我们不用指定长度。
但是同时它又暴露了一个问题,通过上面的例子,我们不难发现:我们可以将任何类型的数据添加到ArrayList中。这是因为,它会把所有插入其中的数据当作为object类型来处理。我们大家都知道object是所有类型的父类,我们在存取这些数据时,注定要经过繁琐的数据类型的转换,而这些过程,对于我们的数组来说,会造成类型不安全的问题隐患,同时它更会带来了很大的性能消耗。
那么为了解决这些问题,泛型List出现了。
1、概念
首先我们要知道,泛型List是ArrayList类的泛型等效类。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。详情请见本人另一篇博文:C#中List泛型用法,必知必会!
2、示例
- List<int> list = new List<int>();
- //新增数据
- list.Add(123);
- //修改数据
- list[0] = 345;
- //移除数据
- list.RemoveAt(0);
3、反思
在上例中,如果我们往List集合中插入string字符"hello world",IDE就会报错,且不能通过编译。这是因为我们已经规定了这个List集合是int类型的,此时我们将无法插入其他数据类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。