.NET C# Dictionary Hashtable

news2024/11/24 15:43:48

.NET C# Dictionary & Hashtable

文章目录

  • .NET C# Dictionary & Hashtable
    • 1 Dictionary
      • 1.1 底层实现
      • 1.2 优点
      • 1.3 缺点
    • 2 Hashtable
      • 2.1 底层实现
      • 2.2 优点
      • 2.3 缺点
    • 3 对比总结
    • 4 遍历方式,与耗时对比
      • foreach遍历
      • Keys遍历
      • IDictionaryEnumerator遍历
      • 耗时对比

1 Dictionary

1.1 底层实现

  • 哈希表Dictionary 底层实现是一个哈希表。它使用键的哈希值来快速定位值。
  • 泛型支持Dictionary<TKey, TValue> 是泛型的,可以存储任何类型的键和值,这增加了类型安全性。
  • 存储结构:内部使用一个数组来存储键值对,并通过哈希函数计算每个键的哈希值,将其映射到数组中的一个索引位置。

1.2 优点

  • 类型安全:由于是泛型,编译时可以检查类型,避免了类型转换错误。
  • 性能:查找、插入和删除操作的平均时间复杂度为 O(1),非常高效。
  • 灵活性:可以存储任何类型的键和值,使用方便。

1.3 缺点

  • 内存消耗:由于使用泛型和哈希表,内存消耗相对较大。
  • 初始化时间:初始化和重新调整大小时可能会有较大的时间开销。

2 Hashtable

2.1 底层实现

  • 哈希表Hashtable 也使用哈希表来实现。
  • 非泛型Hashtable 是非泛型的,键和值都是 object 类型,需要进行装箱和拆箱操作。

2.2 优点

  • 灵活性:可以存储任何类型的键和值,但需要进行类型转换。
  • 历史悠久:在 .NET 1.0 中就存在,兼容旧版本代码。

2.3 缺点

  • 类型不安全:由于键和值都是 object 类型,编译时无法检查类型,容易出错。
  • 性能较差:由于需要装箱和拆箱,性能不如 Dictionary
  • 过时:随着泛型集合的引入,Hashtable 已经不再推荐使用。

3 对比总结

  1. 类型安全性Dictionary 是泛型的,更加类型安全,而 Hashtable 是非泛型的,需要进行类型转换。
  2. 性能Dictionary 性能优于 Hashtable,特别是在涉及大量数据操作时。
  3. 内存消耗Dictionary 由于泛型和哈希表的实现,内存消耗较大,而 Hashtable 相对较小,但性能不如前者。
  4. 历史兼容性Hashtable 由于存在时间较长,在一些旧项目中仍然可以见到,但新的项目一般推荐使用 Dictionary

4 遍历方式,与耗时对比

遍历耗时对比1

遍历耗时对比2

foreach遍历

foreach (DictionaryEntry entry in hashtable)
{
    var key = entry.Key;
    var value = entry.Value;
}

foreach (KeyValuePair<int,int> entry in dictionary)
{
    var key = entry.Key;
    var value = entry.Value;
}

Keys遍历

foreach (var key in hashtable.Keys)
{
    var value = hashtable[key];
}

foreach (var key in dictionary.Keys)
{
    var value = dictionary[key];
}

IDictionaryEnumerator遍历

IDictionaryEnumerator enumeratorHt = hashtable.GetEnumerator();
while (enumeratorHt.MoveNext())
{
    var key = enumeratorHt.Key;
    var value = enumeratorHt.Value;
}

IDictionaryEnumerator enumeratorDic = dictionary.GetEnumerator();
while (enumeratorDic.MoveNext())
{
    var key = enumeratorDic.Key;
    var value = enumeratorDic.Value;
}

耗时对比

static void Main(string[] args)
{
    // 创建并填充Hashtable
    Hashtable hashtable = new Hashtable();
    Dictionary<int,int> dictionary = new Dictionary<int,int>();
    for (int i = 0; i < 10000000; i++)
    {
        hashtable[i] = i;
        dictionary[i] = i;
    }

    // 基准测试
    Stopwatch stopwatch = new Stopwatch();

    // 测试foreach遍历
    stopwatch.Start();
    foreach (DictionaryEntry entry in hashtable)
    {
        var key = entry.Key;
        var value = entry.Value;
    }
    stopwatch.Stop();
    Console.WriteLine($"Hashtable - foreach遍历耗时: {stopwatch.ElapsedMilliseconds} 毫秒");

    stopwatch.Restart();
    stopwatch.Start();
    foreach (KeyValuePair<int,int> entry in dictionary)
    {
        var key = entry.Key;
        var value = entry.Value;
    }
    stopwatch.Stop();
    Console.WriteLine($"Dictionary - foreach遍历耗时: {stopwatch.ElapsedMilliseconds} 毫秒");

    // 测试Keys遍历
    stopwatch.Restart();
    foreach (var key in hashtable.Keys)
    {
        var value = hashtable[key];
    }
    stopwatch.Stop();
    Console.WriteLine($"Hashtable - Keys遍历耗时: {stopwatch.ElapsedMilliseconds} 毫秒");

    stopwatch.Restart();
    foreach (var key in dictionary.Keys)
    {
        var value = dictionary[key];
    }
    stopwatch.Stop();
    Console.WriteLine($"Dictionary - Keys遍历耗时: {stopwatch.ElapsedMilliseconds} 毫秒");

    // 测试IDictionaryEnumerator遍历
    stopwatch.Restart();
    IDictionaryEnumerator enumeratorHt = hashtable.GetEnumerator();
    while (enumeratorHt.MoveNext())
    {
        var key = enumeratorHt.Key;
        var value = enumeratorHt.Value;
    }
    stopwatch.Stop();
    Console.WriteLine($"Hashtable - IDictionaryEnumerator遍历耗时: {stopwatch.ElapsedMilliseconds} 毫秒");

    stopwatch.Restart();
    IDictionaryEnumerator enumeratorDic = dictionary.GetEnumerator();
    while (enumeratorDic.MoveNext())
    {
        var key = enumeratorDic.Key;
        var value = enumeratorDic.Value;
    }
    stopwatch.Stop();
    Console.WriteLine($"Dictionary - IDictionaryEnumerator遍历耗时: {stopwatch.ElapsedMilliseconds} 毫秒");
}

输出:

Hashtable - foreach遍历耗时: 576 毫秒
Dictionary - foreach遍历耗时: 93 毫秒
Hashtable - Keys遍历耗时: 279 毫秒
Dictionary - Keys遍历耗时: 112 毫秒
Hashtable - IDictionaryEnumerator遍历耗时: 147 毫秒
Hashtable - foreach遍历耗时: 576 毫秒
Dictionary - foreach遍历耗时: 93 毫秒
Hashtable - Keys遍历耗时: 279 毫秒
Dictionary - Keys遍历耗时: 112 毫秒
Hashtable - IDictionaryEnumerator遍历耗时: 147 毫秒
Dictionary - IDictionaryEnumerator遍历耗时: 169 毫秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化报表实践小结

这一天午休刚休息完&#xff0c;财务经理就喊我&#xff1a;“***&#xff0c;我们找个会议室聊聊”。我是一脸茫然&#xff0c;心里想着&#xff0c;我跟他也没什么私下的工作交流啊&#xff0c;能聊啥呢&#xff0c;还要找个会议室&#xff1f;究竟是什么事情呢&#xff1f;有…

VsCode无法远程调试

一、问题描述 按照《VsCode gdb gdbserver远程调试C程序》中介绍的方法&#xff0c;配置好VsCode后&#xff0c;按下F5快捷键&#xff0c;或点击“Start Debugging”按钮&#xff0c;没有反应&#xff0c;无法启动调试&#xff1a; 二、解决方法 针对该问题&#xff0c;我尝…

【人工智能】Transformers之Pipeline(八):文生图/图生图(text-to-image/image-to-image)

目录 一、引言 二、文生图/图生图&#xff08;text-to-image/image-to-image&#xff09; 2.1 文生图 2.2 图生图 2.3 技术原理 2.3.1 Diffusion扩散模型原理 2.3.2 Stable Diffusion扩散模型原理 2.4 文生图实战 2.4.1 SDXL 1.0 2.4.2 SD 2.0 2.5 模型排名 三、总…

​【香菇带你学Mysql】Mysql超长执行sql定位和优化【建议收藏】

本文为MySQL数据库管理员和开发人员提供了一套全面的超时SQL定位和优化解决方案。通过合理运用这些方法和技巧&#xff0c;可以显著提升MySQL数据库的性能和稳定性&#xff0c;减少超时SQL语句的发生&#xff0c;确保数据库的高效运行。 0. 引言 最近某个Mysql数据库频繁告警…

统信UOS激活系统故障

统信UOS激活系统故障 1. 离线环境下如何激活系统 ①点击右下角的授权管理 ②点击“激活” ③输入激活码,并点击确定 ④离线环境下此时会弹出二维码,使用微信去扫码,按照提示确定激活 ⑤微信确定以后,激活端会显示成功 2. 激活过程中提示服务器连接失败 激活时如果提示服…

Java多商户新零售超市外卖商品系统

解锁新零售奥秘&#xff0c;多商户外卖超市商品系统大揭秘&#xff01; &#x1f31f; 开篇&#xff1a;新零售时代的浪潮 在这个日新月异的数字化时代&#xff0c;新零售已悄然成为商业变革的新风口。想象一下&#xff0c;足不出户就能逛遍全城商家&#xff0c;心仪商品一键…

智算与大模型人才白皮书学习

目录 智算定义 智算的相关政策 公司的智算战略 服务提供者的定义及服务内容 智算人才需求 典型智算参与者的角色要求 业务流程全过程的分解 自己的定位 智算定义 智算通过智能化技术手段优化和提升技术系统的功能和性能&#xff0c;是为满足未来人工智能发展 和相关应用…

如何快速发现SIM卡托潜在问题?

手机SIM卡托通常是指放置SIM卡的卡槽或卡托。SIM卡托位于手机的侧面或顶部&#xff0c;用于插入SIM卡以连接到移动网络。通常&#xff0c;用户可以通过将SIM卡插入手机SIM卡托来激活手机服务、接收通话、发送短信和使用移动数据。SIM卡托一般设计成易于插拔&#xff0c;使用户能…

DataWhale AI夏令营-英特尔-阿里天池LLM Hackathon

英特尔-阿里天池LLM Hackathon 项目思路项目背景项目思路 Lora微调Qwen模型使用ipex_llm推理加速Gradio交互 项目名称&#xff1a;医疗问答助手 项目思路 项目背景 在当今医疗领域&#xff0c;智能问答系统正在逐步成为辅助医疗诊断的重要工具。随着自然语言处理技术的发展&…

基于STM32的智能家居灯光控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码灯光控制代码应用场景 智能家居灯光控制办公环境智能照明常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居技术的发展&#xff0c;灯光控制系统在提升家居生活品质…

尝鲜 HarmonyOS NEXT 开发环境搭建

申请好 HarmonyOS NEXT的开发套件白名单后&#xff0c;就可以下载最的开发套件了&#xff0c;最新的开发工具更新时间是2024-06-17&#xff0c;DevEcoStudio5.0-API12-x86-402。下载后是这样的&#xff1a; 我用的是 MAC PRO&#xff0c;所以下载的是 MAC 版&#xff0c;这里有…

VMware Linux 虚拟机设置了共享文件夹找不到如何解决?

如果在‌虚拟机中设置了‌共享文件夹但找不到&#xff0c;可能是因为没有正确执行挂载操作。挂载操作是将主机上的共享文件夹与虚拟机中的某个目录关联起来的步骤。 目前已经设置了共享文件夹&#xff0c;但是在Linux 上并没有找到 执行以下操作&#xff1a; mkdir /mnt/hgf…

云原生第一次作业

一、实验准备 1、准备一台rhel7的主机,并开启主机的图形 2、配置好可用IP 3、做kickstart自动安装脚本后面需要用到DHCP&#xff0c;关闭VMware DHCP功能 一、kickstart的安装和配置 安装 yum install system-config-kickstart 配置 安装httpd yum install httpd -y\n\n…

投资充电桩源码 共享充电桩投资理财源码 金融理财源码 最新理财投资源码php 投资理财网站源码

海外共享项目投资源码&#xff0c;投资充电桩源码 共享充电桩投资理财源码 金融理财源码 最新理财投资源码php 投资理财网站源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89612921 更多资源下载&#xff1a;关注我。

软件测试学习笔记

测试学习 1. 测试流程2. Bug的提出什么是bugbug 的描述bug 级别 3. 测试用例的设计什么是测试用例测试用例应如何设计基于需求的设计方法等价类边界值场景法正交表法判定表法错误猜测法 4. 自动化测试回归测试自动化分类 5. 安装 webdriver-manager 和 selenium第一个web自动化…

SAP MM学习笔记 - 豆知识05 - Customer Exit 实例,MM01上定义Customer Exit 来Check评估Class

上一章讲了一些MM模块的豆知识。 - MM01中设定的安全在库和最小安全在库 - MM01/MMSC/Customize自动 扩张物料的保管场所 - MM01中定义生产订单的默认入库保管场所 - VA01受注票中设定禁止贩卖某个物料 SAP MM学习笔记 - 豆知识03 - 安全在库和最小安全在库&#xff0c;扩…

java使用opencv

一、windows安装opencv 下载地址&#xff1a;https://opencv.org/releases/ 下载后安装 本人安装目录 目录说明&#xff1a; build&#xff1a;基于windows构建 java&#xff1a;开发关注 x64、x86对应windows操作系统位数 sources&#xff1a;开源源码 二、java使用ope…

java之多线程篇

一、基本概念 1.什么是线程&#xff1f; 线程就是&#xff0c;操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。简单理解就是&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能 2.什么是多线程&#xff1f; 有了多线…

高清无水印视频素材哪里找?分享几个热门的高清无水印素材网站

一个好的短视频离不开精彩的素材&#xff0c;但高清视频素材哪里找&#xff1f;今天小编就跟大家分享五个可以下载高清无水印短视频素材的网站&#xff0c;如果你还不知道从哪里可以下载高清视频素材&#xff0c;赶紧进来看看吧&#xff01;&#xff5e; 1、稻虎网 首推的是稻…

leetcode数论(​3044. 出现频率最高的质数)-质数判断

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格&#xff0c;你可以按以下方式生成数字&#xff1a; 最多有 8 条路径可以选择&#xff1…