深究C#中数组、ArrayList和List三者的区别

前言:在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢?在本篇博文中,让我们共同探讨!概况内容请见本人另一篇博文:浅谈C#中数组、ArrayList和List三者的区别

一、数组

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对象来克服这些缺点。

二、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出现了。

三、泛型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类型的,此时我们将无法插入其他数据类型。

四、对比总结

  • 数组的容量是固定的,我们只能一次获取或设置一个元素的值,而ArrayList或泛型List的容量可根据需要自动扩充、修改、删除或插入数据。
  • 数组可以具有多个维度,而 ArrayList或泛型List始终只具有一个维度,但是我们可以轻松创建数组列表或列表的列表。
  • 在决定使用泛型List还是使用ArrayList 类(两者具有类似的功能)时,记住泛型List类在大多数情况下执行得更好并且类型安全。如果对泛型List类的类型使用object类型时,则两个类的行为是完全相同的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章