C#中数组、ArrayList和List三者的区别详解

在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢。

数组

数组在C#中最早出现的。在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单。

//数组
string[] s=new string[2];
//赋值
s[0]="a";
s[1]="b";
//修改
s[1]="a1";

但是数组存在一些不足的地方。在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,过段会造成数据溢出的错误。如果在声明数组时我们不清楚数组的长度,就会变得很麻烦。

针对数组的这些缺点,C#中最先提供了ArrayList对象来克服这些缺点。

ArrayList

ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。

 //ArrayList
ArrayList list1 = new ArrayList();
//新增数据
listAdd("cde");
listAdd(5678); 

//修改数据
list[2] = 34; 

//移除数据
listRemoveAt(0); 

//插入数据
listInsert(0, "qwe");

从上面例子看,ArrayList好像是解决了数组中所有的缺点,为什么又会有List?

我们从上面的例子看,在List中,我们不仅插入了字符串cde,而且插入了数字5678。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据当作为object类型来处理,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。

装箱与拆箱的概念:

简单的说:

装箱:就是将值类型的数据打包到引用类型的实例中

比如将string类型的值abc赋给object对象obj

String i=”abc”;
object obj=(object)i;

拆箱:就是从引用数据中提取值类型

比如将object对象obj的值赋给string类型的变量i

object obj=”abc”;
string i=(string)obj;

装箱与拆箱的过程是很损耗性能的。

泛型List

因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。

比如:

List<string> list = new List<string>();
//新增数据
listAdd(“abc”);
//修改数据
list[0] = “def”;
//移除数据
listRemoveAt(0);

上例中,如果我们往List集合中插入int数组123,IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

总结:

数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List<T>的容量可根据需要自动扩充、修改、删除或插入数据。

数组可以具有多个维度,而 ArrayList或 List< T> 始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组 的性能优于 ArrayList的性能。 这是因为 ArrayList的元素属于 Object 类型;所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List< T> 的性能与同类型的数组十分相近。

在决定使用 List<T> 还是使用ArrayList 类(两者具有类似的功能)时,记住List<T> 类在大多数情况下执行得更好并且是类型安全的。如果对List< T> 类的类型T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# 数组查找与排序实现代码

    1. 查找对象 复制代码 代码如下: Person p1 = new Person( " http://www.my400800.cn " , 18 ); Person p2 = new Person( " http://www.my400800.cn " , 19 ); Person p3 = new Person( " http://www.my400800.cn " , 20 ); Person[] persons = ... { p1,

  • C#中数组Array,ArrayList,泛型List详细对比

    在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序集合.数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合. Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义. 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也非常简单. Array数组具体用法: using System; names

  • C# 没有动态的数组,可以用arraylist或list取代

    复制代码 代码如下: using System.Collections; ArrayList a = new ArrayList(); a.Add("a");//这里"a"可以改成你要取出的字符串 a.Add("b"); 运行后a就相当于一个数组a[0]="a",a[1]="b 推荐用泛型 复制代码 代码如下: List<String> list = new List<String>(); f

  • C#动态调整数组大小的方法

    本文实例讲述了C#动态调整数组大小的方法.分享给大家供大家参考.具体如下: 通常,我们创建一个数组后就不能调整其长度,但是Array类提供了一个静态方法CreateInstance用来创建一个动态数组,所以我们可以通过它来动态调整数组的长度. namespace ArrayManipulation { Class Program { static void Main (String[] args) { int[] arr = new int[]{1,2,3}; PrintArr(arr); ar

  • C#使用foreach语句简单遍历数组的方法

    本文实例讲述了C#使用foreach语句简单遍历数组的方法.分享给大家供大家参考.具体如下: using System; public class jb51demo { public static void Main() { int sum = 0; int[] nums = new int[10]; // give nums some values for(int i = 0; i < 10; i++) nums[i] = i; // use foreach to display and su

  • 浅析C#中数组,ArrayList与List对象的区别

    我们先来了解一下数组,因为数组在C#中是最早出现的.数组数组有很多的优点,比如说数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如: 复制代码 代码如下: string[] s=new string[3];//赋值s[0]="a";s[1]="b";s[2]="c";//修改s[1]="b1"; 但是,数组也存在一些不足的地方.比如在数组的两个数据间插入数据也是很麻烦的.还有我们在声明数组的

  • C#难点逐个击破(3):params数组参数

    在方法声明中只允许一个paras关键字,并且该关键字只能为最后一个. 复制代码 代码如下: using System; /****************************** * Chapter:C#难点逐个击破(三) * Author:王洪剑 * Date:2010-1-16 * Blog:http://www.51obj.cn/ * Email:walkingp@126.com * Description:数组参数params的使用 * ***********************

  • C#数组排序的两种常用方法

    本文实例讲述了C#数组排序的两种常用方法.分享给大家供大家参考.具体如下: 1.第一个例子 定义代码 #region Array数组排序1 public class Pigeon : IComparable<Pigeon> //类元素本身继承比较接口 { int XValue; int YValue; public string BatchNo { get; set; } public int CompareTo(Pigeon other) { if (other == null) throw

  • C# byte数组与Image相互转换的方法

    功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上. 这里的Image是System.Drawing.Image. 以下三个函数分别实现了上述三个需求: 复制代码 代码如下: // Convert Image to Byte[]        private byte[] ImageToByte(Im

  • C#中数组、ArrayList和List三者的区别详解及实例

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. //数组 string[] s=new string[2]; //赋值 s[0]="a"; s[1]="b"; //修改 s[1]="a1"; 但是数组存在一些不足的地方.在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度

随机推荐