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,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 语言总复习

总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构 (三个循环结构), 选择结构 (if 和 switch) 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址。 4…

适合selenium的防自动化检测的方法

Selenium 是一个强大的自动化测试工具&#xff0c;能够模拟真实用户与网页的交互。针对您询问的适合在 Selenium 中实施的策略&#xff0c;以下是一些直接适用于或可以通过 Selenium 配置实现的方法&#xff1a; 修改User-Agent: 通过 Chrome 或 Firefox 的选项在启动时设置自…

操作系统智能助手OS Copilot评测报告

背景 如果不是朋友告知&#xff0c;我还不知道阿里云推出了【操作系统智能助手OS Copilot】这样一款产品。 我做系统运维的工作还是挺多的&#xff0c;知道系统运维工作的一些痛点&#xff1b;例如&#xff1a; Linux命令繁杂&#xff0c;想全部记住不太可能&#xff0c;多数…

软件测试《用例篇》

测试用例 测试用例的概念 测试用例是被测试人员向被测试系统发起的一组集合&#xff0c;包括测试环境&#xff0c;操作步骤&#xff0c;预期结果&#xff0c;测试数据等 使用测试用例的好处 使用测试用例进行测试的好处主要有&#xff1a;提高测试效率&#xff0c;降低测试的重…

YOLOV8改进DSConv分布移位卷积

基础干货&#xff1a;高效卷积&#xff0c;降内存提速度保精度 (eepw.com.cn) 各种卷积性能对比(Conv,DwConv,GhostConv,PConv,DCNV)-CSDN博客

WAWA鱼曲折的大学四年回忆录

声明&#xff1a;本文内容纯属个人主观臆断&#xff0c;如与事实不符&#xff0c;请参考事实 前言&#xff1a; 早想写一下大学四年的总结了&#xff0c;但总是感觉无从下手&#xff0c;不知道从哪里开始写&#xff0c;通过这篇文章主要想做一个记录&#xff0c;并从现在的认…

中国智能制造装备产业发展机遇

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 随着全球第四次工业革命的浪潮&#xff0c;智能制造装备产业…

刷leetcode中常用且有效的方法总结

刷题的时候经常会因为不知道一个方法多写很多行代码&#xff0c;既然有trick为何不用&#xff01;你问我眼中为何常含泪水&#xff0c;因为我忘记方法忘的深沉。那么我决定出一期&#xff01;刷题中常用且有效的方法们&#xff01;将会陆续补充,有补充欢迎评论区留言 目录 py…

C++ 函数高级——函数的默认参数

函数默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 语法&#xff1a;返回值类型 函数名 &#xff08;参数 默认值&#xff09;{ } 示例&#xff1a; 正确代码&#xff1a; 运行结果&#xff1a;

昇思25天学习打卡营第13天|sea_fish

打开第13天。本次学习的内容为LLM原理和实践中基于MindSpore通过GPT实现情感分类的内容。记录学习的过程。 根据实验系统中的内容一步一步学习基于MindSpore通过GPT实现情感分类的整个过程。整个过程分为以下三个过程&#xff1a; 数据集加载与处理&#xff1a;数据集加载和数…

开源六轴协作机械臂myCobot 280接入GPT4大模型!实现更复杂和智能化的任务

本文已经或者同济子豪兄作者授权对文章进行编辑和转载 引言 随着人工智能和机器人技术的快速发展&#xff0c;机械臂在工业、医疗和服务业等领域的应用越来越广泛。通过结合大模型和多模态AI&#xff0c;机械臂能够实现更加复杂和智能化的任务&#xff0c;提升了人机协作的效率…

Laravel批量插入数据:提升数据库操作效率的秘诀

Laravel批量插入数据&#xff1a;提升数据库操作效率的秘诀 Laravel作为PHP的现代Web应用框架&#xff0c;提供了优雅而简洁的方法来处理数据库操作。批量插入数据是数据库操作中常见的需求&#xff0c;尤其是在处理大量数据时&#xff0c;批量插入可以显著提高性能。本文将详…

LDAP技术解析:打造安全、高效的企业数据架构

1.LDAP简介 LDAP&#xff08;Lightweight Directory Access Portocol&#xff0c;轻量目录访问协议&#xff09;是一种用于访问与管理分布式目录服务的开放协议。目录服务是一种特殊的数据库&#xff0c;优化用于读取和查询操作&#xff0c;而不是写入操作。LDAP广泛用于身份验…

盘点当下智能体应用开发的几种形态

现在多智能体系统开发的关注度越来越高了&#xff0c;不光在开发者的圈子热度很高&#xff0c;很多职场人士&#xff0c;甚至是小白也参与其中&#xff0c;因为现在的门槛越来越低了&#xff0c;尤其是&#xff0c;最近特别火的扣子&#xff08;coze&#xff09;和百度的appbui…

【TB作品】51单片机 Proteus仿真00016 乒乓球游戏机

课题任务 本课题任务 (联机乒乓球游戏)如下图所示: 同步显示 oo 8个LED ooooo oo ooooo 8个LED 单片机 单片机 按键 主机 从机 按键 设计题目:两机联机乒乓球游戏 图1课题任务示意图 具体说明: 共有两个单片机,每个单片机接8个LED和1 个按键,两个单片机使用串口连接。 (2)单片机…

数据结构学生信息顺序表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { seq_p Screate_seq(); stu data; printf("请问要输入几个学生的数据&#xff1a;"); int n; scanf("%d",&n); while(n--) { prin…

MySQL Binlog详解:提升数据库可靠性的核心技术

文章目录 1. 引言1.1 什么是MySQL Bin Log&#xff1f;1.2 Bin Log的作用和应用场景 2. Bin Log的基本概念2.1 Bin Log的工作原理2.2 Bin Log的三种格式 3. 配置与管理Bin Log3.1 启用Bin Log3.2 配置Bin Log参数3.3 管理Bin Log文件3.4 查看Bin Log内容3.5 使用mysqlbinlog工具…

STM32崩溃问题排查

文章目录 前言1. 问题说明2. STM32&#xff08;Cortex M4内核&#xff09;的寄存器3. 崩溃问题分析3.1 崩溃信息的来源是哪里&#xff1f;3.2 崩溃信息中的每个关键字代表的含义3.3 利用崩溃信息去查找造成崩溃的点3.4 keil5中怎么根据地址找到问题点3.5 keil5上编译时怎么输出…

【NTN 卫星通信】Starlink基于终端用户的测量以及测试概述

1 概述 收集了一些starlink的资料&#xff0c;是基于终端侧部署在野外的一些测试以及测量结果。 2 低地球轨道卫星网络概述 低地球轨道卫星网络(lsn)被认为是即将到来的6G中真正实现全球覆盖的关键基础设施。本文介绍了我们对Starlink端到端网络特征的初步测量结果和观测结果&…

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换&#xff0c;非扫描模式1.6.2 连续转换&#xff0c;非扫描模式1.6.3 单次…