zoukankan      html  css  js  c++  java
  • c# 哈希表

    最近翻开一下c#的基础书,发现c#的哈希表我重来没用过。

    理解一番,觉得和dictionary有点相像,都是键值对(key-value)的形式。

    网上查询了一番,下面说说简单介绍下哈希表Hashtable 。

    哈希表(hashtable)和字典表(dictionary)效率对比:

    Hashtable hashtable = new Hashtable();
    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    int countNum = 1000000;
    DateTime startTime;
    DateTime endTime;
    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    hashtable.Add(i.ToString(), i);
    }
    endTime = DateTime.Now;
    Console.WriteLine("给哈希表赋值:" + (endTime - startTime).Milliseconds); //输出: 796

    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    dictionary.Add(i.ToString(), i);
    }
    endTime = DateTime.Now;
    Console.WriteLine("字典类型赋值:" + (endTime - startTime).Milliseconds); //输出: 448

    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    hashtable.ContainsKey(i.ToString());
    }
    endTime = DateTime.Now;
    Console.WriteLine("输出哈希表值:" + (endTime - startTime).Milliseconds); //输出: 268

    startTime = DateTime.Now;
    for (int i = 0; i < countNum; i++)
    {
    dictionary.ContainsKey(i.ToString());
    }
    endTime = DateTime.Now;
    Console.WriteLine("输出字典类型值:" + (endTime - startTime).Milliseconds); //输出: 183

    结论:添加数据时,dictionary快,频繁调用数据时Dictionary快。Dictionary<K,V>是泛型的,当K或V是值类型时,其速度远远超过Hashtable。

    由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
    [1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
    [2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
    [3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

    不过有人认为:我认为应该始终使用Dictionary<K, V>,即使要用Hashtable了,也可以用Dictionary<object, object>来替代。

  • 相关阅读:
    away3d 4.1 alpha 教程 换装篇 <3> 人物动态换装DEMO
    书本资料汇总
    洪小瑶学IOS(一):准备起航 <ObjectiveC基础教程>笔记
    Flex 4 权威指南 学习笔记
    通过存储过程建立灵活的SQL计划任务
    javascript 未结束的字符串常量
    SQL重复记录查询
    重置数据库自增字段
    C#获取周一、周日的日期 函数类
    C# ,ASP.NET,Winform将数据导出到Execl汇总
  • 原文地址:https://www.cnblogs.com/BeeSnow/p/7989834.html
Copyright © 2011-2022 走看看