C#中的数据结构介绍
作者:.NET开发菜鸟 时间:2022-06-05 18:34:26
一、数组(Array)
数组具有以下的特点:
数组属于线性结构,在内存中是连续存放的。
数组的元素类型必须相同。
数组可以直接通过下标访问。
数组的查找速度非常快,新增和删除速度慢。
数组在初始化时要指定数组长度。
二、动态数组(ArrayList)
动态数组具有以下的特点:
ArrayList的底层其实就是一个数组。
ArrayList在声明时不必指定长度,会根据存储的数据动态的增加或减少长度。
ArrayList会把所有的元素都当做Object处理,因此可以存储不同数据类型的元素。
插入和删除一个元素时,会移动它之后所有元素的位置,效率低,频繁进行插入或者删除元素推荐使用LinkedList。
ArrayList是非类型安全的,在插入和删除元素时会进行拆箱和装箱问题,影响性能,效率低。
三、泛型List
泛型List具有以下的特点:
List是ArrayList的泛型类。
泛型List需要在声明时指定具体的类型。
泛型List没有装箱和拆箱操作,因此List比ArrayList效率高而且类型安全。
四、双向链表(LinkedList)
双向链表具有如下特点:
链表的节点在内存中的空间是不连续的,每块空间称作一个节点,每个节点都存有一个前驱和后置指针,分别指向前一个节点和后一个节点,因此向链表中添加和删除元素的效果高,只需要更改相应节点的指针指向即可。
链表的查找效率低。查找元素时不能通过下标进行访问,只能从头开始通过地址按顺序查找。
五、堆栈(Stack)
堆栈具有如下特点:
堆栈是先进后出的原则,最先插入的元素最后被访问,最后插入的元素最先被访问。
Push入栈,Pop出栈并返回栈顶元素,Peek只返回栈顶元素。
六、Queue(链表)
链表具有以下特点:
链表是先进先出的原则,最先进入的元素最先被访问,最后进入的元素最后被访问。
Enqueue入队列,Dequeue出队列并返回列首元素,Peek只返回列首元素。
七、字典(Dictionary)
字典具有以下特点:
创建字典时需要指定key和value的数据类型。
字典中的key值是唯一的,value的值可以不唯一。
可以通过key快速查找对应的value,速度快,但是消耗内存。
几种常见数据结构的使用情景
Array | 需要处理的元素数量确定并且需要使用下标进行访问时可以考虑,不过建议使用List<T>。 |
ArrayList | 不推荐使用,建议使用泛型List<T>。 |
泛型List<T> | 需要处理的元素数量不确定时,通常建议使用。 |
LiskedList<T> | 链表适合元素数量不固定,而且需要经常增减节点的情况,链表增减元素效率高。 |
Queue<T> | 队列适合于先进先出的情况。 |
Stack<T> | 堆栈适合于先进后出的情况。 |
Dictionary<K,T> | 字典适合于需要键值对操作的情况。 |
来源:https://www.cnblogs.com/dotnet261010/p/12333598.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)
![](https://img.aspxhome.com/file/2023/6/71856_0s.png)
MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)
一篇文章带你搞定JAVA注解
![](https://img.aspxhome.com/file/2023/2/63012_0s.png)
Spring Security实现用户名密码登录详解
![](https://img.aspxhome.com/file/2023/1/61051_0s.png)
详解在LINUX上部署带有JAR包的JAVA项目
![](https://img.aspxhome.com/file/2023/7/78427_0s.png)
Unity实现俄罗斯方块(二)
![](https://img.aspxhome.com/file/2023/0/69780_0s.jpg)
Spring占位符Placeholder的实现原理解析
![](https://img.aspxhome.com/file/2023/5/66075_0s.png)
java的基本数据类型及属性
Java 分割字符串详解及实例代码
解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法
java中i = i++和i =++i的深入讲解
Android中通过样式来去除app的头及界面全屏(备忘)的实现方法
深入了解Java核心类库--Math类
java使用Jdom实现xml文件写入操作实例
ImportBeanDefinitionRegistrar手动控制BeanDefinition创建注册详解
C++高并发内存池的整体设计和实现思路
![](https://img.aspxhome.com/file/2023/3/103083_0s.png)
C#调用dll报错:无法加载dll,找不到指定模块的解决
![](https://img.aspxhome.com/file/2023/7/74837_0s.png)
剑指Offer之Java算法习题精讲数组与字符串
![](https://img.aspxhome.com/file/2023/0/77370_0s.png)
web 容器的设计如何实现
![](https://img.aspxhome.com/file/2023/2/68772_0s.jpg)
浅谈Java的虚拟机结构以及虚拟机内存的优化
![](https://img.aspxhome.com/file/2023/1/64921_0s.jpg)