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

数组

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

<span style="font-family:SimSun;font-size:18px;">//数组
string[] s=new string[2];//赋值
s[0]="a";
s[1]="b";
//修改
s[1]="a1";
</span>

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

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

ArrayList

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

<span style="font-family:SimSun;font-size:18px;">//ArrayList
ArrayList list1 = new ArrayList();//新增数据
list1.Add("cde");
list1.Add(5678);//修改数据
list[2] = 34;//移除数据
list.RemoveAt(0);//插入数据
list.Insert(0, "qwe");
</span>

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

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

装箱与拆箱的概念:
    简单的说:
    装箱:就是将值类型的数据打包到引用类型的实例中
    比如将string类型的值abc赋给object对象obj

<span style="font-family:SimSun;font-size:18px;">String  i=”abc”;
object obj=(object)i;
</span>

  拆箱:就是从引用数据中提取值类型
      比如将object对象obj的值赋给string类型的变量i

<span style="font-family:SimSun;font-size:18px;">object obj=”abc”;
string i=(string)obj;
</span>

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

使用 foreach遍历 arraylist可以 隐式的拆箱

foreach(type objName in collection/Array)

  其中type 是拆箱的对象类型,但是这种方法,要保证arraylist中的对象类型全部为一种类型

泛型List

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

比如:

<span style="font-family:SimSun;font-size:18px;">List<string> list = new List<string>();//新增数据
list.Add(“abc”);//修改数据
list[0] = “def”;//移除数据
list.RemoveAt(0);
</span>

  上例中,如果我们往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使用值类型,则需要考虑实现和装箱问题。

数组使用方便 ,插入 困难 ,数据对象 不灵活

arrylist     里面的对象是object  没有类型限制

list   可以自定义数组

转载于:https://www.cnblogs.com/wangjian920110/p/5391398.html

C#中数组、ArrayList和List三者的区别(转) ,加修改相关推荐

  1. C#中的泛型 / 泛型类 / 数组、ArrayList和List三者的区别

    C#中数组.ArrayList和List三者的区别 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的, ...

  2. 面试中常被问到(四)C/C++中数组,指针和引用的区别

    C/C++中数组,指针和引用的区别 数组和指针: 数组 指针 保存数据 保存数据地址 可直接访问元素的值 间接访问(首先获取指针内容作为地址,通过寻址找到元素的值) 一般大小固定,数据类型相同 一般用 ...

  3. C++中数组和指针的关系(区别)详解

    C++中数组和指针的关系(区别)详解 本文转自:http://c.biancheng.net/view/1472.html 博主在阅读后将文中几个知识点提出来放在前面: 没有方括号和下标的数组名称实际 ...

  4. c# list 容量_C#中数组、ArrayList和List三者的区别 转

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  5. c#中数组,ArrayList和List 三者的区别

    在c#中,数组在内存中是连续的,索引速度很快,赋值和修改也很简单. string[] s=new string[2]; //赋值 s[0]="a"; s[1]="b&qu ...

  6. C#中数组、ArrayList和List三者的区别

    在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...

  7. C#.NET中数组、ArrayList和List三者的区别

    数组在C#.NET中是最早出现的,在内存中是顺序连续存储的,所以它的索引速度非常快,赋值与修改元素也很简单:但是,也正因为数组是顺序连续存储的,在两个数据间插入数据是很不方便的,而且在声明数组的时候必 ...

  8. python的数组和元组区别_python中数组,列表,元组的区别、定义、功能

    准确的来说,在python中是没有数组类型的,python中取而代之的是列表和元组.列表比元组好用,因为元组一旦定义就没法修改.而列表不仅可以和数组一样按索引访问,还有一堆的功能. 列表: (1)添加 ...

  9. python/numpy中数组array和矩阵matrix的区别

    在numpy中,array(实际上是ndarray,表示多维数组)是可以有多维度的,而matrix只有两个维度,即行和列.所以matrix是array的一种特例,因而它继承了array的所有函数,同时 ...

最新文章

  1. 我的第一个React Native App
  2. dos命令操作mysql数据库的常用语句
  3. mac mysql 设置短命令_短小强大的8个命令,分分钟帮你提高工作效率!
  4. Win10右键没有压缩选项的解决教程
  5. 【算法导论】学习笔记——第9章 中位数和顺序统计量
  6. WORD常用版式保存为模板?
  7. 形参与实参的区别---java基础
  8. 华为随身wifi不显示无服务器,没网卡不要紧 华为随行WiFi Pro让你上网无忧
  9. CentOS 编译 Nginx 服务
  10. 【剑指Offer】18树的子结构
  11. Java程序模拟QQ空间登录 - 并模拟刷说说的赞(图文) 注意:腾讯修改了加密算法,已失效(2015-01-31)
  12. C++ 2022常见知识点
  13. C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件类型
  14. Photoshop制作印章效果
  15. 外部世界如何访问容器? - 每天5分钟玩转 Docker 容器技术(37)
  16. 小米/红米手机刷第三方rom(红米5 plus为例)
  17. chr 13 java 替换_Java ROT13编码转换算法实现
  18. html5加载更多,HTML5[7]: 实现网页版的加载更多
  19. Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化
  20. 打开GTA 5竟要跑19.8亿次if语句!黑客嘲讽R星代码烂,修改后直接省70%加载时间

热门文章

  1. 用来用去还是觉得SDCMS好用
  2. 表格内容排序(js实现)
  3. CC++初学者编程教程(8) VS2013配置编程助手与QT
  4. arm opcode hook
  5. Javascript高级程序设计第二版第十四章--异常--笔记
  6. 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧
  7. mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)
  8. 戴尔电脑开机黑屏怎么办_笔记本电脑开机黑屏怎么办
  9. java实现回文验证_LeetCode 精选 TOP 面试题(Java 实现)—— 验证回文串
  10. java自定义迭代器作用_Java实现的自定义迭代器功能示例