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

 更新时间:2016年12月03日 16:33:47   作者:zhang_xinxiu  
这篇文章主要介绍了C#中数组、ArrayList和List三者的区别详解,对于三者之间的区别想要了解的可以进来了解一下。
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

在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使用值类型,则需要考虑实现和装箱问题。

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

相关文章

  • C#中struct与class的区别详解

    C#中struct与class的区别详解

    本文主要介绍了C#中struct与class的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C#精确计算年龄的方法分析

    C#精确计算年龄的方法分析

    这篇文章主要介绍了C#精确计算年龄的方法,实例分析了C#计算时间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 基于C#实现电脑系统挂机锁

    基于C#实现电脑系统挂机锁

    这篇文章主要为大家详细介绍了如何利用C#实现电脑系统挂机锁,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 深入分析c# 继承

    深入分析c# 继承

    这篇文章主要介绍了c# 继承的相关资料,文中讲解的非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C# 以MDF文件链接数据库的示例代码

    C# 以MDF文件链接数据库的示例代码

    本篇文章主要介绍了C# 以MDF文件链接数据库的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C#创建简单windows窗体应用(加法器)

    C#创建简单windows窗体应用(加法器)

    这篇文章主要为大家详细介绍了C#创建一个简单windows窗体应用的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#画笔Pen使用路径绘制图形的方法

    C#画笔Pen使用路径绘制图形的方法

    这篇文章主要介绍了C#画笔Pen使用路径绘制图形的方法,涉及C#使用画笔精确控制绘图轨迹的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C# Resources资源详解

    C# Resources资源详解

    这篇文章主要为大家详细介绍了C# Resources资源,包括Resource Basics、Strongly Typed Resources等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • C#动态生成PictureBox并指定图片的方法

    C#动态生成PictureBox并指定图片的方法

    这篇文章主要介绍了C#动态生成PictureBox并指定图片的方法,实例分析了C#图形控件的动态生成及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#语法糖(Csharp Syntactic sugar)大汇总

    C#语法糖(Csharp Syntactic sugar)大汇总

    首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。这让java开发人员羡慕不已,呵呵。
    2010-06-06

最新评论

?


http://www.vxiaotou.com