在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();

//新增数据

list1.Add("cde");

list1.Add(5678);

//修改数据

list[2] = 34;

//移除数据

list.RemoveAt(0);

//插入数据

list.Insert(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 list = new List();

//新增数据

list.Add(“abc”);

//修改数据

list[0] = “def”;

//移除数据

list.RemoveAt(0);

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

总结:

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

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

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

c# list 容量_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#中数组、ArrayList和List三者的区别(转) ,加修改

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

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

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

  6. java中的类跟结构体_C#中的结构体与类的区别

    经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字str ...

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

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

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

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

  9. java arraylist指定容量_Java中的ArrayList的容量

    List接口的大小可变数组的实现.实现了全部可选列表操做,并容许包括 null 在内的全部元素. ArrayList继承于List接口,除继承过来的方法外,还提供一些方法来操做内部用来存储列表的数组的 ...

最新文章

  1. c#图片base64去转义字符_C#实现字符串与图片的Base64编码转换操作示例|chu
  2. ASP.NET Core MVC 中的 [Controller] 和 [NonController]
  3. javafx 示例_示例介绍:JavaFX 8打印
  4. txtv28pw河南某中学_中学生骑行典型交通事故案例集 | 知危险会避险
  5. SpringSecurity 跨域问题 Cors
  6. 【Mac】Mac 使用 zsh 后, mvn 命令无效
  7. Win10如何配置数据源ODBC数据源
  8. RS232、RS485标准以及在DB9公头、母头上的接线定义
  9. SPSS学习笔记(一)
  10. go语言中文乱码gbk转UTF8
  11. presenting controller presented controller 如何区分
  12. html如何做动态桌面壁纸,wallpaper engine怎么自己做壁纸?动态壁纸制作方法
  13. unity使用easy ar制作ar红包
  14. 微信内置浏览器清除缓存
  15. android迅雷下载搭建开发环境
  16. ubuntu16.04 鼠标右键没有压缩/解压 选项
  17. 543.diameter-of-binary-tree
  18. 独特的电子邮箱地址-LeetCode练习(Java实现)
  19. 04 使用three.js开发全景漫游 全景图切换的实现
  20. Python读取Word文档中的Excel嵌入文件

热门文章

  1. 我们学的技术会过时吗?甚至被淘汰?
  2. ​电赛 | 19年全国一等奖,北航学子回忆录。
  3. 在印度8年的华为工程师,有很多话想说。
  4. 20220216-MISC-BUUCTF-另外一个世界-winhex,ASCII转换-FLAG- ZIP文件提取并修复-假如给我三天光明-ZIP改RAR,摩丝电码波形转换-神秘龙卷风brainfuck
  5. Java刷漆问题代码_Java实现蓝桥杯历届试题格子刷油漆
  6. eggjs的参数校验模块egg-validate的使用和进一步定制化升级
  7. Spring Boot错误errMsg: request:ok
  8. 【刷题】BZOJ 4657 tower
  9. Keil C51的库函数
  10. JPA 系列教程3-单向多对一