C# HashTable、HashSet、Dictionary

一、HashTable

哈希表(HashTable)表示键/值对的集合

1.什么是哈希表

哈希表,也叫散列表,是根绝关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

2.哈希表的Key&Value

(1) 添加数据

添加数据都是以“键值对”的形式

(2) “键值对”均是object类型

因为我们添加的数据的类型不能确定是什么类型,所以我们可以采用最高等级的类型——object类型

(3)必须有Key键,且Key键不能重复。

(4)乱序读取数据

Hashtable使用键作为寻找的方式,是一种无序的结构。也就是说,当我们读取hashtable中存取的值的时候,读取到的数据是乱序的。

3.基本操作

		    Hashtable ht = new Hashtable();
            //添加一个keyvalue键值对
            ht.Add(Key, value);

            //移除某个keyvalue键值对
            ht.Remove(key);

            //移除所有元素
            ht.Clear();

            //判断是否包含特定键key
            ht.Contains(key);

二、HashSet

HashSet类主要是设计用来做高性能集运算的

1.特点

HashSet是以数学Set集合为基础的,使用HashSet可以提高集合的运算。使用HashSet集合不自带排序方法,如果需要排序的需求可以参考使用List集合配合Sort方法。

HashSet的优势在与运算快,作为一种存放在内存的数据,可以很快的进行设置和取值的操作。HashSet无法向里面添加重复的数据,避免添加HashSet里面的数据重复。我们使用HashSet常常在集合相加集合相减这些集合与集合之间的操作之中。

使用HashSet作为内存存储的快速数据库,这个需要随时跟新HashSet里面的数据,因为在HashSet中一个长时间未被访问的数据,将被系统自动回收掉,那么就会导致失败,那么如何才能保证HashSet里面的值是长存在的而且达到不断的更新里面的值呢?

首先程序过来访问我们HashSet里面有没有需要的数据,如果有我们需要的数据就直接返回给用户,不用调用查询数据库的操作。如果HashSet里面没有我们需要的数据,程序再去查询一次数据库是否有该Query数据,如果有返回给用户同时把查询的结果添加到HashSet里面,这么做可以一定程度的降低查询数据库所带来的不便,但是不能根除,需要进一步提升性能,可以查看前面的缓存策略使用memcached来提高网站查询和访问。

2.HashSet常用扩展方法

Add,将项目添加到HashSet之中。

Clear,清空HashSet里面的值。

Remove,从HashSet中移除值。

Contains,判断HashSet是否包含指定项目。

Equals(Object),判断是否相等

3.HashSet与Linq操作

HashSet与LINQ的对等的方法

UnionWith ==> Union

IntersectWith ==> Interset

ExceptWith ==> Except

不提供排序 ==> Distinct

三、Dictionary

Dictionary表示键和值的集合。
Dictionary<string, string>是一个泛型

他本身有集合的功能有时候可以把它看成数组

他的结构是这样的:Dictionary<[key], [value]>

他的特点是存入对象是需要与[key]值一一对应的存入该泛型

通过某一个一定的[key]去找到对应的值

四、HashTable和Dictionary的区别

(1).HashTable不支持泛型,而Dictionary支持泛型。

(2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

(3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。

(4)在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。

posted @   有诗亦有远方  阅读(143)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示