GameFramework学习之语法知识——HashTable,Dictionary,ArrayList,List,LinkList和数组之间的区别

特别注明:

转载出处:https://www.cnblogs.com/MrZivChu/p/list.html Hastable和Dictionary以及ArrayList和(List,LinkedList,数组)的区别(作者:MrZivChu)


—–为什么不直接收藏?因为,敲一遍记得牢固一些,有助于逐句思考和理解,而且,以后方便查看。


1. HashTable 与 Dictionary 的区别

1)单线程中建议使用Dictionary,有泛型优势,且读取速度较快,容量利用更充分。
2)多线程中建议使用Hashtable,默认的hashTable允许单线程写入,多线程读取,对HashTable进一步调用Synchornized()【 ['sɪŋkrənaɪzd],同步】方法可以获得完全线程安全的类型,而Dictionary非线程安全,必须手动使用Lock进行保护,效率不高。
3)Dictionary有按插入顺序排列数据的特性(注:当调用Remove()删除过节点后顺序被打乱),因此在需要体现顺序的情况下使用Dictionary较为方便。
4)对于值类型,既定类型(不包括Object)的Dictionary性能优于hashTable。因为hashTable的元素属于Object类型,在存储或者检索值类型时会发生拆装箱的操作。用Dictionary可以避免拆装箱。

线程安全性:
Dictionary:

只要不修改该集合,Dictionary就可以同时支持多个阅读器。即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。当出现枚举与写访问互相竞争用这种极少发生的情况时,必须在整个枚举过程中锁定集合。若要允许多个线程访问集合来进行读写操作,则必须要实现自己的同步。有关线程安全另类的信息,请参见 ConcurrentDictionary。 此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。

HashTable:

HashTable是线程安全的,可由多个读取器线程和一个写入线程使用。多线程使用时去,如果只有一个线程执行写入(更新)操作,则它是线程安全的,从而允许进行无锁定的读取(若编写器序列化为HashTable)。若要支持多个编写器,如果没有任何线程在读取HashTable对象,则对HashTable的所有操作都必须通过Synchronized方法返回的包装完成。从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程,即使一个集合已经进行同步,其他线程仍可以通过修改该集合,将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。


2. ArrayList和LinkedList的区别:

1)ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构。
2)对于随机访问Get和Set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3)对于新增和删除操作Add和Remove,linkedList比较占优势,因为ArrayList要移动数据。

3. ArrayList和List的区别:

1)ArrayList添加成员过程中会发生拆装箱的操作,可以插入类型不同的值,因为它把每个元素都当作Object类型来处理。当我们获取不当时,会报类型不匹配这样错误。
2)List添加成员时不会发生拆装箱,只能插入类型相同的值,可以确保类型安全。

4. 数组(Array)的优缺点:

优点:

索引速度非常快,而且赋值与修改元素也很简单,直接根据索引找到对象来进行操作即可。

缺点:

在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度。如果数组的长度过长,会造成内存浪费。
过段会造成数据溢出的错误。如果在声明数组时我们不知道数组的长度,就会变得很麻烦。针对数组的这些缺点,C#中提供了ArrayList和List来弥补这些缺点。


5.其他数据集合的类型:

引用出处:
https://www.cnblogs.com/jesse2013/p/CollectionsInCSharp.html C#集合类型大盘点(作者:腾飞(Jesse))

1)HashSet    2)Stack     3)Queue    4)SortedSet
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值