当前位置: 首页 > article >正文

C#基础-区分数组与集合

目录

区分数组与集合

1.定义

1)数组

2)集合

2.大小

1)数组

2)集合

3.访问速度

1)数组

2)集合

4.内存管理

1)数组

2)集合

5.使用场景

1)数组

2)集合

总结


       本篇文章来学习一下C#的数组(Array)与集合(Collection),数组和集合是两种常用的数据结构,均为引用类型,下面通过定义、大小、访问速度等方面比较数组和集合的不同,来进一步加深对它们的理解。

区分数组与集合

1.定义

1)数组

①数组是固定大小的,可以存储相同类型的多个元素

②一旦数组的大小被确定,就不能改变

③数组的元素可以通过索引访问,索引从0开始

④数组支持基本类型(如 int、char 等)以及引用类型(如 string、object 等)

2)集合

①集合是一种可以动态调整大小的数据结构,支持在运行时增删元素。

②集合是 System.Collections 命名空间下的类,最常用的有List<T>、Dictionary<TKey, TValue>、Queue<T>、Stack<T>等。

③集合可以包含不同类型的元素,尤其是当使用泛型时(如 List<int>),它可以存储指定类型的元素。

④集合在性能上通常比数组灵活,但可能在某些操作(如索引访问)上稍逊色。

2.大小

1)数组

       数组的大小在创建时是固定的,创建后不能更改,即创建一个数组时,必须指定它初始长度。如果需要更多元素,必须创建一个新的数组并复制现有数据。

int[] arr = new int[5]; //长度为 5

2)集合

       集合(如 List<T>)是动态大小的,在运行时自动调整,可以根据需要增大或缩小。

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Remove(2);

3.访问速度

1)数组

       数组的访问速度非常快,因为它们是基于索引访问的,并且是连续的内存块。由于数组是固定大小的,C#运行时不会做任何内存管理上的调整,因此在性能要求较高的场景下,数组是一个不错的选择。

int[] arr = {1, 2, 3, 4, 5};
int firstElement = arr[0];//直接索引访问

2)集合

       集合的访问速度通常比数组稍慢,尤其是在使用List<T>这类需要动态调整大小的集合时。动态扩容和内存分配可能会引入一些额外的开销。不过,对于大多数场景,集合的访问性能是可以接受的。List<T>提供的索引访问也很高效,但集合的增删操作比数组更加灵活:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };
int firstElement = list[0];//通过索引访问

4.内存管理

1)数组

       数组是一个固定大小的连续内存块,内存分配时一次性申请所需大小。对于值类型(如int、double)来说,数组是非常高效的。对于引用类型,数组中的每个元素存储的是引用(指向对象的指针),而不是实际的对象。

2)集合

       集合是动态扩展的,通常在需要时进行内存分配和调整。动态调整大小可能会导致内存碎片,尤其是当集合在执行大量插入和删除操作时。大多数集合会在容量不足时自动扩展。如List<T> 默认会将容量加倍,直到足够容纳新的元素。

5.使用场景

1)数组

①已知大小的数据:事先知道集合大小时,数组通常是最合适的选择。它在内存中是一个连续的块,因此访问速度非常快。如,存储一组固定数量的学生成绩、处理图片的像素数据等。

②性能要求高:当性能非常关键时,尤其是需要频繁访问数据时,数组是一个理想的选择。由于数组的内存布局是连续的,它在访问和操作时会有更高的性能。

③不可修改的集合:当数据在生命周期内不会发生变化(不会增删数据),数组是最合适的选择。

2)集合

①动态数据:当需要在运行时动态地添加、删除或调整数据时,集合(如 List<T>)是理想的选择。如,实时更新用户输入的数据、动态生成的数据集等。

②不确定数据量:当无法确定数据的数量时,集合提供了灵活性。如处理用户输入或从外部源读取数据时,使用集合会更方便。

③复杂的数据操作:集合类(如 Dictionary<T, T>、Queue<T>、Stack<T>)提供了比数组更丰富的功能,如哈希查找、队列操作、堆栈操作等。在需要这些特定功能时,集合通常比数组更合适。

总结

       总之,数组适用于数据量固定、性能要求高的场景,而集合适用于数据量动态变化、需要灵活增删和复杂操作的场景。在选择时,应该根据具体的需求和数据特点来决定使用数组还是集合。

特性数组(Array)集合(Collection)
大小固定,创建时确定动态,可增减元素
灵活性不灵活,不能动态增减元素灵活,支持动态增删元素
性能访问速度快,但不支持动态增删访问速度稍慢,支持更复杂的操作
内存管理固定大小,内存效率高动态内存管理,可能导致内存碎片
适用场景已知大小的静态数据、高性能需求动态数据、灵活性需求、复杂操作场景

       好了,本次的分享到这里就结束啦,希望对你有所帮助~


http://www.kler.cn/a/390549.html

相关文章:

  • Jmeter基础篇(22)服务器性能监测工具Nmon的使用
  • FatLab:我的编程课程系列
  • Openstack7--安装消息队列服务RabbitMQ
  • 【 ElementUI 组件Steps 步骤条使用新手详细教程】
  • 2019年下半年试题二:论软件系统架构评估及其应用
  • uniapp 设置安全区域
  • 微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪
  • 24/11/12 算法笔记<强化学习> Policy Gradient策略梯度
  • IT运维的365天--019 用php做一个简单的文件上传工具
  • go 下划线 _ 被称为“空白标识符
  • 【Lucene】全文检索 vs 顺序扫描,为何建立索引比逐个文件搜索更高效?
  • 第 4 章 - Go 语言变量与常量
  • 构造函数原型对象语法、原型链、原型对象
  • hadoop开发环境搭建
  • 【论文速看】DL最新进展20241112-3D、异常检测、车道线检测
  • Python科学计算的利器:Scipy库深度解析
  • [滑动窗口] 长度最小的子数组, 无重复字符的最长子串, 最大连续1的个数③
  • SQL Server 索引如何优化?
  • 使用轻易云平台高效集成聚水潭与南网订单数据
  • 侯宗原国学退费:学会易理摆脱精神内耗
  • 揭开 gRPC、RPC 、TCP和UDP 的通信奥秘
  • Chrome与火狐哪个浏览器的移动版本更流畅
  • Unity3D 帧同步定点数物理引擎解决方案详解
  • 树-好难-疑难_GPT
  • spark的学习-04
  • 人工智能在智能家居中的应用