C#中数组[]、ArrayList、List集合、Dictionary字典、LinkedList的区别与性能分析
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
数组: int[] buff = new int[6]; ArrayList: ArrayList buff = new ArrayList(); List: List Dictionary: Dictionary LinkedList: LinkedList 分析比较: 从上面初始化的几种类型可以看出,他们都属于引用类型。其中数组、List、Dictionary、LinkedList在初始化的时候需要指定其元素类型,而ArrayList不需要指定类型。而在其中只有数组在初始化时设置了其大小。 数组:在初始化时必须指定其大小和类型,他在内存中是连续存储的,所以可以看出数组的索引速度是非常快的。在确定了数组的长度和类型后,选择数组存储数据是比较好的选择。不适合插入操作。 ArrayList:在初始化的时候不需要指定其大小和类型。他可以存储不同的数据类型,但是在存取得过程中会引起装箱和拆箱,降低了性能。插入操作方便。 List:在初始化的时候必须指定其类型,但是不需要指定大小,所以他不会像ArraryList那样在存取过程中引起装箱和拆箱操作。在类型相同的情况下,List和数组的性能相当。插入操作方便。 Dictionary:在初始化的时候也必须指定其类型,而且他还需要指定一个Key,并且这个Key是唯一的。正因为这样,Dictionary的索引速度非常快。但是也因为他增加了一个Key,Dictionary占用的内存空间比其他类型要大。他是通过Key来查找元素的,元素的顺序是不定的。 LinkedList:数组和数组列表都有一个重大的缺陷,这就是从数组的中间位置删除一个元素需要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。在数组的中间的位置插入一个元素也是如此。如下图: 这个问题就靠LinkedList(链表)来解决。链表将每个对象存放在独立的节点中,每个节点还存放着序列中上一个节点的引用和下一个节点的引用,如下图: 这样,从链表中间删除一个元素是很轻松的操作,即需要对删除元素附近的节点更新一下即可,如下图: 性能测试: 经过测试,测试数据会有波动性,但基本能反应整体情况: 插入性能:List < HashTable < Dictionary < LinkedList 遍历性能:HashTable < Dictionary < LinkedList < List 删除性能:List < HashTable < LinkedList < Dictionary
该文章在 2021/3/5 14:29:27 编辑过 |
关键字查询
相关文章
正在查询... |