C# List、LinkedList、Dictionary性能对比
数据结构性能对比 List、LinkedList、Dictionary
1. ArrayList (List:前传)
ArrayList
是一个特殊数组,
通过添加和删除元素就可以动态改变数组的长度。
ArrayList集合相对于数组的优点:
支持自动改变大小,
可以灵活的插入元素,
可以灵活的删除元素,
可以灵活的访问元素。
ArrayList 自身缺陷:
ArrayList只支持一维,
并且查询和检索的速度较慢。
简而言之
灵活性提升,速度不足。
在C#中数据类型分为两类:值类型和引用类型。
值类型
int ,bool, char, double, enum, struct, DateTime等
都是值类型
引用类型
string,Array,class集合 等都是引用类型。
值类型和引用类型的重要特征如下:
差别:
值类型的长度固定,
而引用类型的长度不固定
数据存储:
如果是值类型直接存储在栈中(局部变量),
如果是引用类型,先把数据存储在堆中,然后把堆的地址存储在栈中。
object类:所有类的基类
所有的数据类型都可以转换成object类,
ArrayList 在存储的时候全被转换成object类型存储
这就是为什么ArrayList既可以存储值类型,也可以存储引用类型。
灵活性 换 性能:
当然这也是ArrayList的一个缺点,
由于存储的时候需要把值类型封装成object类型,
取出来的时候需要再把object类型再转换成值类型,
这一装箱和拆箱的过程非常消耗性能。
正所谓,鱼与熊掌,不可兼得。
扩展阅读
装箱:
由值类型封装成object类型的过程称为装箱。
拆箱:
由object类型转换成值类型的过程称为拆箱。
2. List
传承:
List 继承了ArrayList的特点,高灵活性。
改进:
基于ArrayList低性能的弱点,我们进行了改进!
在声明时需要指定类型,避免装箱拆箱操作,提升性能。
只是多写个<int>就极大提高了速度,何乐而不为。
特点:
拥有索引,可进行排序,修改等等。
3. LinkedList
新的问题:
ArrayList或者List虽说灵活性很好,
但都有个缺陷,插入元素或者移除元素时速度较慢,
因为存在:后续元素的位置变化!
厌恶真空:
中间一旦有人缺席,所有人都要前移去补位,牵一发动全身,
因此,没事千万别往ArrayList和List中间踢人或插队。
避免造成连锁反应,途耗性能!
解决方案:
LinkedList每个元素记录下一个元素的位置,
插入或者移除元素时只需要修改标记即可,
不用移动后面的元素,大大提高了效率。
使用方法
ArrayList vs Lis vs LinkedList:
尽量避免用ArrayList,多线程时候可以用ConcurrentBag代替。
插入、删除较多用LinkedList,否则用List。
包(Bag)包可包含重复元素(此处对应List)。
集(Set)集中不能包含重复元素。
4. HashTable
key-value组合,可以添加不同类型的数据,取出之后需要转换成对应类型
Hashtable hashtable = new Hashtable(); hashtable.Add("Name", "HadsNyx");hashtable.Add("age", 25);return hashtable;
HashTable线程安全,允许单线程写入,多线程读取。
5. Dictionary
key-value组合,必须指定数据类型
特点:
速度较快,不必装箱拆箱
非线程安全(即使这样,也可以用ConcurrentDictionary代替)
HashTable vs Dictionary :
Dictionary效率高,但是人为lock保持线程安全时效率反而低下。
多线程编程用ConcurrentDictionary,只有单线程用Dictionary。
优化小技巧:
由于Dictionary有底层,有桶和链表结构,
有时候将List转为Dictionary进行操作,
(用主键作为key,保证无重复元素),反而效率更高。
6. 性能排序:
插入性能: LinkedList > Dictionary > HashTable > List
遍历性能:List > LinkedList > Dictionary > HashTable
删除性能: Dictionary > LinkedList > HashTable > List
统计:
Dictionary,3项性能都在前三的位置
LinkedList,3项性能都在前二的位置
小结:
在修改较频繁,且查找和删除也较多时,首选LinkedList,
在主要以删除为主,插入为辅,且查找较少时,首选Dictionary,
在查找频繁,而又无需修改的情况下,则首选List。
总结:
只查找,首选List;
插入为主,查找和删除为辅,首选LinkedList;
删除为主,查找和插入为辅,首选Dictionary;
注意:是插入不是新增,新增都没多大区别
扩展阅读
HashSet<T>和SortedSet<T>
HashSet<T>和SortedSet<T>都属于集
Set:元素不可重复
加入重复元素时并不会报错。
SortedSet还有排序的功能
例如:加入1、3、2,foreach会得到1、2、3
导航图:(右键新窗口中打开,否则404)
array 数组
arraylist 动态数组
list 列表
queue 队列
stack 堆栈
linkedlist 链表
hashtable 哈希表
dictionary 字典
SortedList 排序列表
SortedDictionary 排序字典
hashset 哈希集
sortedset 排序集
PS:
为什么ArrayList的效率会比较低
因为ArrayList是使用数组实现的,若要从数组中删除或插入某一个对象,需要移动后段的数组元素,从而会重新调整索引顺序,调整索引顺序会消耗一定的时间,所以速度上就会比LinkedList要慢许多. 相反,LinkedList是使用链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用即可。
array的效率要比List的要高一些,当数组长度不是很大时,两者没什么区别,建议用List<>,毕竟是可变长度,可以Add;特殊应用还是建议用array,
相关文章:
C# List、LinkedList、Dictionary性能对比
数据结构性能对比 List、LinkedList、Dictionary 1. ArrayList (List:前传) ArrayList 是一个特殊数组, 通过添加和删除元素就可以动态改变数组的长度。 ArrayList集合相对于数组的优点: 支持…...
【Spring Cloud】微服务的简单搭建
文章目录 🍃前言🎄开发环境安装🌳服务拆分的原则🚩单一职责原则🚩服务自治🚩单向依赖 🍀搭建案例介绍🌴数据准备🎋工程搭建🚩构建父子工程🎈创建父…...
全球首款商用,AI为视频自动配音配乐产品上线
近日,海外推出了一款名为Resona V2A的产品,这是全球首款商用视频转音频 (V2A) 技术产品。这项突破性技术利用AI,仅凭视频数据即可自动生成高质量、与上下文相关的音频,包括声音设计、音效、拟音和环境音,为电影制作人、…...
Git管理源代码、git简介,工作区、暂存区和仓库区,git远程仓库github,创建远程仓库、配置SSH,克隆项目
学习目标 能够说出git的作用和管理源代码的特点能够如何创建git仓库并添加忽略文件能够使用add、commit、push、pull等命令实现源代码管理能够使用github远程仓库托管源代码能够说出代码冲突原因和解决办法能够说出 git 标签的作用能够使用使用git实现分支创建,合并…...
【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索
文章目录 引言第一章:机器学习在时间序列分析中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 自回归模型1.2.2 移动平均模型1.2.3 长短期记忆网络1.2.4 卷积神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 A…...
执行力不足是因为选择模糊
选择模糊:执行力不足的根源 选择模糊是指在面对多个选项时,缺乏明确的目标和方向。这种模糊感会导致犹豫不决,进而影响我们的执行力。 选择模糊的表现: 目标不明确,不知道应该做什么。优先级混乱,不清楚…...
力扣 225题 用队列实现栈 记录
题目描述 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素…...
中英双语介绍意大利(Italy):有哪些著名景点、出名品牌?
中文版 意大利概述 意大利,位于欧洲南部,是一个以其悠久的历史、丰富的文化遗产和美丽的自然风光而闻名的国家。意大利不仅是文艺复兴的发源地,还拥有众多世界著名的城市、景点和品牌。 著名城市 罗马(Rome)&#x…...
Python【打包exe文件两步到位】
Python打包Exe 安装 pyinstaller(pip install pyinstaller) 执行打包命令(pyinstaller demo.py) 打完包会生成 dist 文件夹,如下如...
基于模型预测控制的PMSM系统速度环控制理论推导及仿真搭建
模型预测控制(Model Predictive Control, MPC)是一种先进的控制策略,广泛应用于工业控制中。它可以看作是一种最优控制方法,利用对象的动态模型来预测其状态的未来行为,并根据每个采样时间点特定性能目标函数的优化来确…...
【PYG】GNN和全连接层(FC)分别在不同的类中,使用反向传播联合训练,实现端到端的训练过程
文章目录 基本步骤GNN和全连接层(FC)联合训练1. 定义GNN模型类2. 定义FC模型类3. 训练循环中的联合优化解释完整代码 GNN和全连接层(FC)分别使用不同的优化器和学习率分别进行参数更新解释 基本步骤 要从GNN(图神经网…...
vue3使用方式汇总
1、引入iconfont阿里图库图标: 1.1 进入阿里图标网站: iconfont阿里:https://www.iconfont.cn/ 1.2 添加图标: 1.3 下载代码: 1.4 在vue3中配置代码: 将其代码复制到src/assets/fonts/目录下࿱…...
Turborepo简易教程
参考官网:https://turbo.build/repo/docs 开始 安装全新的项目 pnpm dlx create-turbolatest测试应用包含: 两个可部署的应用三个共享库 运行: pnpm install pnpm dev会启动两个应用web(http://localhost:3000/)、docs(http://localhost…...
初中物理知识点总结(人教版)
初中物理知识点大全 声现象知识归纳 1 .声音的发生:由物体的振动而产生。振动停止,发声也停止。 2.声音的传播:声音靠介质传播。真空不能传声。通常我们听到的声音是靠空气传来的。 3.声速:在空气中传播速度是:340…...
ChatGPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建等高级进阶
目录 第一章 ChatGPT-4o使用进阶 第二章 大语言模型原理详解 第三章 大语言模型优化 第四章 开源大语言模型及本地部署 第五章 从0到1搭建第一个大语言模型 第六章 智能体(Agent)构建 第七章 大语言模型发展趋势 第八章 总结与答疑讨论 更多应用…...
【开源项目】LocalSend 局域网文件传输工具
【开源项目】LocalSend 局域网文件传输工具 一个免费、开源、跨平台的局域网传输工具 LocalSend 简介 LocalSend 是一个免费的开源跨平台的应用程序,允许用户在不需要互联网连接的情况下,通过本地网络安全地与附近设备共享文件和消息。 项目地址&…...
ARM/Linux嵌入式面经(十一):地平线嵌入式实习
地平线嵌入式实习面经 1.自我介绍 等着,在给大哥们准备了。 2.spi与iic协议可以连接多个设备吗?最多多少个?通讯时序。 这是几个问题,在回答的时候。不要一问就开口,花几秒钟沉吟思考整理一下自己的思路。 这个问题问了几个点?每个点的回答步骤。 是我的话,我会采用以…...
基于Redis的分布式锁
分布式场景下并发安全问题的引发 前面通过加锁解决了单机状态下一人一单的问题,但是当出现了分布式,前面的加锁形式不再适用 ,每个jvm有一个自己的锁监视器,只能被内部线程获取,其他jvm无法使用,那么多台j…...
如何将 Apifox 的自动化测试与 Jenkins 集成?
CI/CD (持续集成/持续交付) 在 API 测试 中的主要目的是为了自动化 API 的验证流程,确保 API 发布到生产环境前的可用性。通过持续集成,我们可以在 API 定义变更时自动执行功能测试,以及时发现潜在问题。 Apifox 支持…...
【FFmpeg】av_write_frame函数
目录 1.av_write_frame1.1 写入pkt(write_packets_common)1.1.1 检查pkt的信息(check_packet)1.1.2 准备输入的pkt(prepare_input_packet)1.1.3 检查码流(check_bitstream)1.1.4 写入…...
先定义CSP的核心变量
67-考虑光热电站的综合能源系统优化调度模型 摘要:代码主要做的是含有光热电站的综合能源系统优化调度模型,共做了四个算例,分别对比了目标函数一次、二次、考虑弃风弃光、碳排放等四个算例,综合能源系统主要设备包括光热电站、风…...
本地AI聊天、交互助手(写给小白的LLM工具选型系列:第三篇)
诸神缄默不语-个人技术博文与视频目录 在这一章介绍的是,已经有了AI大模型推理服务(不管是云端API还是本地服务),想要一个像聊天框那样的界面来跟大模型聊天、或者让大模型做更复杂的工作。 本章主要考虑的功能还是AI对话&#x…...
3步实现跨平台文献管理效率跃升:WPS-Zotero开源工具深度应用指南
3步实现跨平台文献管理效率跃升:WPS-Zotero开源工具深度应用指南 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 在学术研究的数字化工作流中,如何解…...
etcd 显示连接失败
文章目录一、查看服务运行情况二、查看具体日志1. 错误原因2. 解决方法方案 1:修改 etcd 配置文件方案 2:直接修改 systemd 服务文件方案 3:临时测试(不推荐生产环境)3. 验证是否解决4. 其他注意事项配置一致性&#x…...
番茄小说下载器:打造个人离线书库的终极指南
番茄小说下载器:打造个人离线书库的终极指南 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读时代,你是否曾遇到过网络不稳定导致无法阅读心爱…...
猫抓Cat-Catch:5步掌握浏览器资源嗅探的终极指南
猫抓Cat-Catch:5步掌握浏览器资源嗅探的终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常在网页上看到喜欢的视频却无…...
Promise/A+ 规范:引用不可变 + 核心术语(对象 / 函数)详解
Promise/A 规范:引用不可变 核心术语(对象 / 函数)详解 文章目录Promise/A 规范:引用不可变 核心术语(对象 / 函数)详解前言一、“引用不可变” 是什么意思?二、为什么要强调 “引用不可变”&…...
微信聊天记录永久保存终极指南:如何用WeChatMsg掌控你的数字记忆
微信聊天记录永久保存终极指南:如何用WeChatMsg掌控你的数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...
从Dirty COW到内核攻防:竞态条件漏洞的现代利用与防御思考
1. Dirty COW漏洞:一个潜伏十年的"定时炸弹" 2016年10月,一个名为Dirty COW的Linux内核漏洞震惊了整个安全界。这个漏洞的特殊之处在于,它从2007年就潜伏在Linux内核中,历经近十年才被发现。更可怕的是,它影…...
承美之话小程序开发概述
承美之话小程序开发概述承美之话小程序是一款基于微信生态的社交或服务类应用,可能涉及美学分享、艺术交流、生活美学等内容。开发此类小程序需结合微信官方开发规范与业务需求,以下为关键开发要点:核心功能模块用户系统 集成微信开放能力&am…...
