【转】!C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别

在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。

由于这种限制不方便,所以出现了ArrayList。

ArrayList、List<T>


ArrayList是可变长数组,你可以将任意多的数据Add到ArrayList里面。其内部维护的数组,当长度不足时,会自动扩容为原来的两倍。

但是ArrayList也有一个缺点,就是存入ArrayList里面的数据都是Object类型的,所以如果将值类型存入和取出的时候会发生装箱、拆箱操作(就是值类型与引用类型之间的转换),这个会影响程序性能。在.Net 2.0泛型出现以后,就提供了List<T>。

List<T>是ArrayList的泛型版本,它不再需要装箱拆箱,直接取,直接用,它基本与ArrayList一致,不过在使用的时候要先设置好它的类型,而设置好类型之后,不是这种类型的数据,是不允许Add进去的。

就性能来说,如果要存进数组的只有一种数据,那么无疑List<T>是最优选择。

List<int> ListInt = new List<int>();

如果一个变长数组,又要存int,又要存string。那么就只能用ArrayList。

HashTable(哈希表)、Dictionary<T,T>


HashTable是一种根据key查找非常快的键值数据结构,不能有重复key,而且由于其特点,其长度总是一个素数,所以扩容后容量会比2倍大一点点,加载因子为0.72f。

当要大量使用key来查找value的时候,HashTable无疑是最有选择,HashTable与ArrayList一样,是非泛型的,value存进去是object,存取会发生装箱、拆箱,所以出现了Dictionary<T,T>。

Dictionary<T,T>是HashTable的泛型版本,存取同样快,但是不需要装箱和拆箱了。而且,其优化了算法,Hashtable是0.72,它的浪费容量少了很多。

Dictionary<string,Person> Dic = new Dictionary<string,Person>();

HashSet<T>


HashSet<T>类,算法,存储结构都与哈希表相同,主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特定顺序的元素。

Queue、Queue<T>


Queue队列,Queue<T>泛型队列,大学都学过,队列,先进先出,很有用。

Stack、Stack<T>


Stack堆栈,先进后出。

SortedList、SortedList<TKey,TValue>


SortedList集合中的数据是有序的。可以通过key来匹配数据,也可以通过int下标来获取数据。

添加操作比ArrayList,Hashtable略慢;查找、删除操作比ArrayList快,比Hashtable慢。

SortedDictionary<TKey,TValue>


SortedDictionary<TKey,TValue>相比于SortedList<TKey,TValue>其性能优化了,SortedList<TKey,TValue>其内部维护的是数组而SortedDictionary<TKey,TValue>内部维护的是红黑树(平衡二叉树)的一种,因此其占用的内存,性能都好于SortedDictionary<TKey,TValue>。唯一差在不能用下标取值。

ListDictionary(单向链表),LinkedList<T>(双向链表)


List<T>,ArrayList,Hashtable等容器类,其内部维护的是数组Array来,ListDictionary和LinkedList<T>不用Array,而是用链表的形式来保存。链表最大的好处就是节约内存空间。

ListDictionary是单向链表。

LinkedList<T>双向链表。双向链表的优势,可以插入到任意位置。

HybridDictionary


HybridDictionary的类,充分利用了Hashtable查询效率高和ListDictionary占用内存空间少的优点,内置了Hashtable和ListDictionary两个容器,添加数据时内部逻辑如下:

当数据量小于8时,Hashtable为null,用ListDictionary保存数据。

当数据量大于8时,实例化Hashtable,数据转移到Hashtable中,然后将ListDictionary置为null。

BitArray


BitArray这个东东是用于二进制运算,"或"、"非"、"与"、"异或非"等这种操作,只能存true或false;

应用场景


ArrayList,List<T>:变长数组;

HashTable,Dictionary<T,T>:频繁根据key查找value;

HashSet<T>:集合运算;

Queue、Queue<T>:先进先出;

Stack、Stack<T>:堆栈,先进先出;

SortedList、SortedList<TKey,TValue>:哈希表,要通过下标,又要通过key取值时,可选用;

ListDictionary:单向链表,每次添加数据时都要遍历链表,数据量大时效率较低,数据量较大且插入频繁的情况下,不宜选用。

LinkedList<T>:双向链表;

HybridDictionary:未知数据量大小时,可用。

SortedDictionary<TKey,TValue>:SortedList<TKey,TValue>的优化版,内部数组转平衡二叉树。

BitArray:二进制运算时可选用;

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

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

相关文章

JS字面量对象

<pre name"code" class"javascript">var A {name : "A",age : 18,sayNameAge : function(){ alert(A.name);alert(A.age);} }A.sayNameAge我搜到的资料上面都叫这种产生对象的方式叫 “对象字面量”&#xff0c;而我认为叫做 "字面量…

Hbase2修复 - HBCK2

第一次尝试修复HBase&#xff1a;https://blog.csdn.net/weixin_43736084/article/details/121336868 第二次尝试修复HBasehttps://blog.csdn.net/weixin_43736084/article/details/121336326

比较文本差异的工具_Linux 开发的五大必备工具 | Linux 中国

Linux 已经成为工作、娱乐和个人生活等多个领域的支柱&#xff0c;人们已经越来越离不开它。在 Linux 的帮助下&#xff0c;技术的变革速度超出了人们的想象&#xff0c;Linux 开发的速度也以指数规模增长。因此&#xff0c;越来越多的开发者也不断地加入开源和学习 Linux 开发…

【转】C# 动态对象(dynamic)的用法

说到正确用法&#xff0c;那么首先应该指出一个错误用法&#xff1a; 常有人会拿var这个关键字来和dynamic做比较。实际上&#xff0c;var和dynamic完全是两个概念&#xff0c;根本不应该放在一起做比较。var实际上是编译期抛给我们的“语法糖”&#xff0c;一旦被编译&#x…

关于prototype使用位置问题的讨论

问题贴&#xff1a;http://bbs.csdn.net/topics/390446362 new四部曲&#xff1a; &#xff08;1&#xff09;创建一个新的对象&#xff0c;并让函数的 this 指针指向它&#xff1b; &#xff08;2&#xff09;将函数的 prototype 对象的所有成员都赋给这个新对象&#xff0c…

第二次尝试修复Hbase2出现Region不一致,使用 HBCK2 - 2021.11.15

spark任务中入hbase任务全部失败了&#xff0c;查看日志发现hbase出现问题 报错日志&#xff1a; 在hbase的log中看到报错 Call queue is full on xxxx,16000,1611197476326, too many items queued 修改了配置文件&#xff0c;增加了队列数量 <property><name>h…

@query传参_vue-router中params传参和query传参的区别及处理方法

在 Vue 实例内部&#xff0c;你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push想要导航到不同的 URL&#xff0c;则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录&#xff0c;所以&#xff0c;当用户点击浏览器后退按钮时&#xff0c;则…

JS成员函数声明位置优化

上代码 function A() {this.a function(){}; } a1 new A(); a2 new A(); alert( a1.aa2.a);输出 说明了a1.a&#xff0c;a2.a指向的内存不是同一个&#xff0c;也就是每个对象都有一份自己的函数&#xff0c;只不过一个类的所有实例之间的函数长得是一样的&#xff01; 所以…

【转】什么是用例

用例是什么? 其原始英文是usecase&#xff0c;直译过来就成了用例。这也是一个比较贴切的叫法了。 从字面的直接理解就是使用的例子。 另一种比较流行的定义是用例就是与使用者(actor)交互的&#xff0c;并且给使用者提供可观测的有意义的结果的一系列活动的集合。 这个定义…

第一次尝试修复Hbase2出现Region不一致,HBCK2

出现问题的原因 Hadoop中报错&#xff0c;集群中某节点的一块磁盘损坏了&#xff0c;运维修复后&#xff0c;hbase出现了region不一致的情况。 修复HBCK2 首先查看web ui中被lock的producer&#xff0c;先释放父region使用bypass -or pid&#xff0c;再释放子producer使用byp…

mybatis plus 事务管理器_SpringBoot第七篇:springboot开启声明式事务

springboot开启事务很简单&#xff0c;只需要一个注解Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务&#xff0c;引入它们依赖的时候&#xff0c;事物就默认开启。当然&#xff0c;如果你需要用其他的orm&#xff0c;比如beatlsql&…

【转】MySQL日期函数与日期转换格式化函数大全

Mysql作为一款开元的免费关系型数据库&#xff0c;用户基础非常庞大&#xff0c;本文列出了MYSQL常用日期函数与日期转换格式化函数 1、DAYOFWEEK(date) 1 2 SELECT DAYOFWEEK(‘2016-01-16) SELECT DAYOFWEEK(‘2016-01-16 00:00:00) 1 -> 7 (表示返回日期date是星期几…

JS静态变量和静态函数

function A(){this.id "我是AA"} // 在构造函数外定义的都是所有对象共享的 A.id "我是A"; A.sayId function(){alert(A.id);} A.sayId(); 如上&#xff0c;在构造函数外用函数名定义的属性或者方法&#xff0c;可以也只可以通过函数名来访问&…

Spark读取HDFS上的Snappy压缩文件所导致的内存溢出问题 java.lang.OutOfMemoryError: GC overhead limit exceeded

报错java.lang.OutOfMemoryError: GC overhead limit exceeded HDFS上有一些每天增长的文件&#xff0c;使用Snappy压缩&#xff0c;突然某天OOM了 1.原因: 因为snappy不能split切片&#xff0c;也就会导致一个文件将会由一个task来读取&#xff0c;读取后解压&#xff0c;数…

【转】VS编程,快速折叠或者展开代码到 #region 级别的设置方法。

在代码比较多的文档中&#xff0c;使用#region进行分功能的区分折叠是一个方便的方法。 如果文档中含有很多个#region标签&#xff0c;想一次全部折叠或者展开&#xff0c;有时是必要的。 这里给出一种设置方法&#xff0c;适用于VS2019&#xff0c;其它VS版本请自己验证。 1、…

记录一个JS异常Uncaught NotFoundError

在使用appendChild和insertBefore时&#xff0c;出现 Uncaught NotFoundError : An attempt was made to reference to a Node in a cotext where it does not exist 错误 经测试是因为误认为parent可以是向上n级的parent&#xff0c;而实际上应该是向上第一级的parent才正确…

.net一个函数要用另一个函数的值_Mysql:条件判断函数-CASE WHEN、IF、IFNULL详解

前言在众多SQL中&#xff0c;统计型SQL绝对是让人头疼的一类&#xff0c;之所以如此&#xff0c;是因为这种SQL中必然有大量的判读对比。而条件判断函数就是应对这类需求的利器。本文重点总结CASE WHEN、IF、IFNULL三种函数。1 CASE WHENCase when语句能在SQL语句中织入判断逻辑…

记录一次HBase的scan的分页查询

修改前任bug&#xff0c;Hbase查询过于慢了&#xff0c;以至于都查不出来了&#xff0c;看了代码发现使用的Scan只设置了withStartRow、withEndRow、setCaching扫描,拿到全部数据后存入集合再subList进行分页&#xff0c;但是HBase中存在某些数据有几百万条&#xff0c;根本sca…

python需要配置环境变量吗_python需要设置哪些环境变量?我只知道一个PYTHONHOME指向安装目录。(python详细安装教程 path)...

怎么把Python文件夹添加进Path中 “我的电脑”点右键&#xff0c;“属性” “高级”&#xff0c;“环境变量”&#xff0c;“系统变量” 然后&#xff0c;Path添加“c:\python26”之类的。 怎么在Path中添加Python路径 ⒈单击开始&#xff0c;在搜索框输入cmd&#xff0c;然后&…

qt5.3.1+opencv2.4.9编译环境的搭建

到官网下载qt-opensource-windows-x86-mingw482_opengl-5.3.1.exe文件&#xff0c;执行该文件&#xff0c;选择默认安装即可实现QT的安装&#xff08;安装在C盘的根目录下&#xff09;&#xff0c;该文件封装好了Qt libraries、Qt Creator&#xff0c;其中Qt Creator为3.1.2版本…