hashTabel  List  和 dic

原:https://www.cnblogs.com/jilodream/p/4219840.html

.Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较

 

参考资料

http://www.cnblogs.com/MichaelYin/archive/2011/02/14/1954724.html

http://zhidao.baidu.com/link?url=DonFgOvFddsAVKUjY4WBwCgE6cO4jLjapPS14Hb3iobC3f6QwYB-3R6OQkRArowg2vzxLnTiujkHss6iy2wFDq

http://www.cnblogs.com/lori/archive/2011/08/09/2132380.html

http://www.coding123.net/article/20120419/DataTable-IList-compare.aspx

首先:

(ling)在.Net  模仿java 的过程中   抛弃了 HashMap ,所以以后再去面试.Net的时候当别人问你HashTable 和HashMap 的区别的时候,请告诉他,C#.Net 中  没有HashMap

好接下来进入正题

.Net 中HashTable 和 Dictionary<key,value> 和List<T>的比较(不要问我怎么和题目不一样),本文只比较两种数据类型在使用时 功能相近的情况,差别太大的 则不比较。

先来比较

(yi)HashTable    和Dic 

 

数据结构

Hashtable和Dictionary从数据结构上来说都属于Hashtable(哈希表),都是对关键字(键值)进行散列操作,将关键字散列到Hashtable的某一个槽位中去,不同的是处理碰撞的方法。散列函数有可能将不同的关键字散列到Hashtable中的同一个槽中去,这个时候我们称发生了碰撞,为了将数据插入进去,我们需要另外的方法来解决这个问题。

采用链表法的是Dic    而采用开放寻址法(open addressing)-中  双重散列的方法的是 HashTable

至于这两种数据结构的使用方法  请自行阅读算法导论   或者参照网上博客

但从底层的数据结构可以发现

如果增删的动作很多的话 推荐使用Dic  因为解决碰撞的方式  是List.Add

如果改动的动作很少  查询的动作很多的话   则推荐 使用HashTable  因为映射查找之后  只需要跳跃查找到  碰撞后移动数据即可,另外当增加数据太多时,开放寻址的扩容很耗费性能(请阅读<算法导论>)

Dic 和HashTable使用比较

1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
 2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用  Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护,  效率大减.
 3:Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便. //Dic遍历时  会采用插入时的遍历,而hashTable 采用遍历时 则是打乱的

Hashtable 类和 Dictionary<TKey, TValue> 泛型类实现 IDictionary 接口 
Dictionary<TKey, TValue> 泛型类还实现 IDictionary<TKey, TValue>泛型接口。
因此,这些集合中的每个元素都是一个键/值对。

Dictionary<TKey, TValue> 类与 Hashtable 类的功能相同
对于值类型,特定类型(不包括 Object)的 Dictionary<TKey, TValue> 的性能优于 Hashtable,这是因为 Hashtable 的元素属于 Object  类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。

 

(er)Dic  和 List<T>

关于数据结构:

在前边的比较已经介绍了Dic   那么 List <T> 的数据结构是什么样子的:

List<T>是 ArrayList 的泛型等效类(继承了泛型接口)

堆中的样子是这样的

我们为了讨论遍历时Dictionary和List的效率,有个高人写了个代码,这是载图

很明显,LIST效率要好的多。

问题剖析

同样是集合,为什么性能会有这样的差距。我们要从存储结构和操作系统的原理谈起。

首先我们清楚List<T>是对数组做了一层包装,我们在数据结构上称之为线性表,而线性表的概念是,在内存中的连续区域,除了首节点和尾节点外,每个节点都有着其唯一的前驱结点和后续节点。我们在这里关注的是连续这个概念。

而HashTable或者Dictionary,他是根据Key而根据Hash算法分析产生的内存地址,因此在宏观上是不连续的,虽然微软对其算法也进行了很大的优化。

由于这样的不连续,在遍历时,Dictionary必然会产生大量的内存换页操作,而List只需要进行最少的内存换页即可,这就是List和Dictionary在遍历时效率差异的根本原因。

所以根据value 的查找  dic 的效率是高于 List 的 但是遍历的话   则Dic 要差点。这就好比你要摘抄书里边的所有文字  是根据目录 查一个找一篇文章 快,还是直接从正文开始 从头到尾快遍历快一样。单独的找某一篇知道题目(key)的文章 当然是从目录快了

再谈Dictionary

也许很多人说,既然Dictionary如此强大,那么我们为什么不用Dictionary来代替一切集合呢?

在这里我们除了刚才的遍历问题,还要提到Dictionary的存储空间问题,在Dictionary中,除了要存储我们实际需要的Value外,还需要一个辅助变量Key,这就造成了内存空间的双重浪费。

而且在尾部插入时,List只需要在其原有的地址基础上向后延续存储即可,而Dictionary却需要经过复杂的Hash计算,这也是性能损耗的地方。

List<T>和 DataTable

DataTable,IList性能比较
1)二进制序列化的情况

从测试结果可以看出,IList<T>序列化的文件大小比DataTable小得多,这意味着在数据传输中带宽占用小很多,所以在设计Remoting接口时尽量使用IList<T>作返回值。

2)XML序列化的情况

从测试结果可以看出,IList<T>序列化后的文件比同样比DataTable小,但差距已经没有二进制序列化那么明显了。而且IList<T>的二进制序列化和XML序列化相差很大,所以remoteing中建议使用二进制序列化。

3)操作性比较

  DataTable有支持数据的提交、回滚、查询等强大的方法,但访问单元格内容的时候不方便,还要类型转换。

  IList<T>则访问项的属性比较方便,有属性自动提示,不用类型转换,有LINQ的协助也能实现强大的查询。

hashTabel List 和 dic的更多相关文章

  1. python征程3.1(列表,迭代,函数,dic,set,的简单应用)

    1.列表的切片. 1.对list进行切片.'''name=["wangshuai","wangchuan","wangjingliang", ...

  2. Python_Day_03 list,dic,tuple方法总结

    编程语言中最长见的几种数据类型,字典,列表,等.同样在Python中也有这些数据类型,只是有些表现形式不同.同时在Python中又多了一种叫做元组(tuple)的东西. list(列表) 初始化列表 ...

  3. iOS不使用JSONKit做Dic到JsonString的转换

    NSDictionary to jsonString [self DataTOjsonString:dic] -(NSString*)DicToJsonString:(id)object { NSSt ...

  4. iOS -- 给model赋值时走了[self setValuesForKeysWithDictionary:dic]不走setvalue: forked:

    这是一个小坑, 看看你的BaseModel的便利构造器的方法: + (__kindof BaseModel *)modelWithDic:(NSDictionary *)dic { return [[ ...

  5. Python中的List,Tuple,Dic,Set

    Python中的List,Tuple,Dic,Set List定义 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推 ...

  6. Ansj分词双数组Trie树实现与arrays.dic词典格式

    http://www.hankcs.com/nlp/ansj-word-pairs-array-tire-tree-achieved-with-arrays-dic-dictionary-format ...

  7. python dic字典使用

    #!/usr/bin/env python -*-''' 字典的基本组成及用法: dict={key:value} dict[key]=value 字典是无序的. key值是唯一属性,一对一,几个ke ...

  8. 批量操作RunTime之获取的Dic换成Model

    方法一: // // AlinkDeviceInfo.m //// // Created by Vivien on 2018/10/12. // Copyright © 2018年 . All rig ...

  9. PaodingAnalysis 提示 "dic home should not be a file, but a directory"

    Exception in thread "main" net.paoding.analysis.exception.PaodingAnalysisException: dic ho ...

随机推荐

  1. 《Exception团队》第一次作业:团队亮相

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 深入了解软件思想,强化编程技术 二.正文 1. ...

  2. netty的简单的应用例子

    一.简单的聊天室程序 public class ChatClient { public static void main(String[] args) throws InterruptedExcept ...

  3. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  4. [C++]UVaLive7324 ASCII Addtion

    Description Nowadays, there are smartphone applications that instantly translate text and even solve ...

  5. Linux基础命令(三)——>文件过滤及内容编辑处理命令

    1.cat   合并文件或查看文件内容 基本功能:cat   test.txt     查看文件内容 也可以多文件显示 cat  test1.txt test2.txt >test3.txt   ...

  6. vue组件创建的三种方式

    1.使用Vue.extend创建全局的Vue组件 //1.1 使用vue.extend创建组件 var com1 = Vue.extend({ //通过template属性指定组件要展示的html结构 ...

  7. Thunar 通过快捷键在当前文件夹打开终端

    参考『Keyboard shortcut for open terminal here in thunar』\(^{[1]}\) 在 ganiserb/thunar-terminal 下载脚本. 将脚 ...

  8. C# 获取电脑配置信息

    对于软件绑定电脑常用到的方法汇总 public class Computer { public string MyProperty { get; set; } /// <summary> ...

  9. hadoop启动 datanode的live node为0

    hadoop启动 datanode的live node为0 浏览器访问主节点50070端口,发现 Data Node 的 Live Node 为 0 查看子节点的日志 看到 可能是无法访问到主节点的9 ...

  10. 【easy】107. Binary Tree Level Order Traversal II 按层输出二叉树

    按层输出二叉树,广度优先. 3 / \ 9 20 / \ 15 7 [ [15,7], [9,20], [3] ] /** * Definition for a binary tree node. * ...