用数组或list存放数据 当访问数据或查找数据时,都需要通过遍历来查找下表获取值,耗时间
而使用Hash存储,是通过哈希函数直接存放元素值,查找迅速,T(n)=O(1)
有两种不同类型的哈希表:哈希集合和哈希映射
-
哈希集合 是 集合数据结构的实现之一,用于存储非重复值
-
哈希映射 是 映射数据结构的实现之一,用于存储(key, value)键值对
在C#中,哈希集合对应的是Hashset;哈希映射对应的是Hashtable和Dictionary
***使用数组也可以实现哈希表的形式 ***当数据量小时,首先考虑数组,其次考虑HashSet。当需要存键值对时,考虑用映射(如Dictionary...)。
(1)集合
Hashset 元素唯一
常用API:
Contains 、Remove 、
RemoveWhere:参数为Predicate<T> 委托,用于定义要移除的元素应满足的条件。
IsProperSubsetOf:用于判断 HashSet 是否为某一个集合的完全子集
UnionWith:集合的合并
IntersectWith:表示两个 HashSet 的交集
ExceptWith:表示数学上的减法操作,T(n)= O(N), 从setA 中移除调 setB的元素
SymmetricExceptWith:返回两个集合中不全有的元素集合
(2)映射
(HashMap是Jave中的哈希映射实现方式)
Hashtable是非泛型的,key类型都是Object。是线程安全的,在多线程环境中,需要手动同步,可以通过 lock
等同步机制来确保对 Hashtable
的并发访问是安全的。如果需要线程安全,推荐使用ConcurrentDictionary。
Dictionary是泛型集合,更严格,可规定输入数据类型。是非线程安全的,多线程环境中可能会导致异常或数据不一致。
另外还有ConcurrentDictionary,是兼具两者优点的。
它是线程安全的,允许多个线程同时读取和写入,而不需要显式的锁定。它使用一种锁分段的机制,允许并发操作而不会导致整个字典被锁定。---------如果你在多线程环境中进行操作,并需要高度的并发性和线程安全性,那么 ConcurrentDictionary
是更好的选择。如果在单线程或低并发环境中,Dictionary
可能更为简单且足够高效。