Hashtable和Dictionary:哪个更快?

5

也许这个问题已经被回答了很多次,但以许多不同的方式。然而,我正在寻找更具体的内容。我相信通用字典比哈希表更快,因为它们不需要经过装箱/拆箱的过程。

然而,哈希表是否排序,这意味着搜索可能更快?由于键是哈希和存储的,因此在搜索时会涉及到装箱/拆箱吗?


只有在Hashtable中使用值类型(结构体)时,才会出现装箱 / 拆箱。否则,在检索条目时想要获取特定类型时,它只是转换而已。此外,你应该使用HashSet,它是通用查找,而不是Hashtable - Igor
你为什么认为哈希表会排序任何东西? - Servy
2个回答

9

3

Hashtable已被视为过时,除了向后兼容性和一些极端情况,如COM Interop

字典还提供类型安全,并避免装箱过程(这使它们在一般情况下更快)。

但是,如果你真的想知道它对性能的影响,使用Stopwatch分别计时两种类型在两个相同数据集上执行相同操作的时间差异!

代码可能如下所示:

        Stopwatch clock = new Stopwatch();
        clock.Start();
        foreach (var item in myCol)
        {
            Hashtable ht = new Hashtable();
            //DoSomething()
        }
        clock.Stop();
        var tHash = clock.Elapsed;
        Stopwatch clock = new Stopwatch();
        clock.Start();
        foreach (var item in myCol)
        {
            Dictionary<,> dict = new Dictionary<,>();
            //DoSomething()
        }
        clock.Stop();
        Console.Write($"Delta t = {Math.Abs((tHash - clock.Elapsed).TotalMilliseconds)}"ms);

除了在一些特殊情况下它可能会有用,否则它应该被视为这样:https://dev59.com/F0nSa4cB1Zd3GeqPRt_2#1590101 - ScottishTapWater
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - DavidG
1
你的观点可以,但称其为过时是不正确的。 - DavidG
哈哈,deprecated基本上意思是一样的。如果那个类被弃用或过时了,那么微软会标记它。 - DavidG
2
@DavidG 你的观点不成立。微软不会将其标记为过时,以免破坏正在使用它的遗留代码。这并不能改变只有遗留代码才应该使用它的事实,并且如果你可以访问Dictionary,就没有理由使用它。这个类确实已经过时了。 - Servy
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接