DICTIONARY和HASHTABLE的区别是什么

kiba518 2012-07-11 01:55:13
加精
RT~RT
另外求解释下 hashcode 和hashtable的关系
...全文
8585 121 打赏 收藏 转发到动态 举报
写回复
用AI写文章
121 条回复
切换为时间正序
请发表友善的回复…
发表回复
newlovedew 2014-09-30
  • 打赏
  • 举报
回复
引用 110 楼 xcy0316 的回复:
[Quote=引用 10 楼 的回复:] 拿事实说话,楼上的某些人该闭嘴就闭嘴。自己测去 Dictionary<object, int> m = new Dictionary<object, int>(); for (int i = 0; i < 10; i++) { m.Add(new object(),i); } foreach (var item in m) { Console.W…… [/Quote] 0.0~
同志,你的例子太片面了,只有add,没有remove,remove后dictionary就乱了
newlovedew 2014-09-30
  • 打赏
  • 举报
回复
引用 41 楼 bwangel 的回复:
看了楼上回复,我确认以下几点: 1.Dictionary<K,V>是以Hash技术为基础构建的。在理想情况下,查找时间复杂度为O(1) 2.从项目实践上看,Dictionary在初始是以插入顺序排的。但MSDN上没有保证过这一点。 3.Hashtable是明确不按插入顺序来排的。 事实上,很多时候,我既需要快速的检索,又需要保证元素的插入顺序。这个时候确很纠结,用List<>的话,只能顺序检索。用Hashtable无法保证顺序。只好用Dictionary了。一般也不会中间删除元素。虽然MSDN没有保证,也就是说他今后改了算法,你的程序跑出错了不是他的责任。 但这个可能性比较小。
+10086
代码誊写工 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 115 楼 的回复:]

1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大……
[/Quote]
学习了,谢谢!对多线程中Hash的使用还没有来得及去测试,你的文档给了我很大帮助,让我少绕了很多弯路。
续写经典 2012-07-24
  • 打赏
  • 举报
回复
1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
3:Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
对于值类型,特定类型(不包括 Object)的 Dictionary<(Of <(TKey, TValue>)>) 的性能优于 Hashtable,这是因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。
geshuai10086 2012-07-24
  • 打赏
  • 举报
回复
很好的东西,谢谢了
月影 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 的回复:]

引用 74 楼 的回复:

所以有些人写的程序遍地是bug, 你用了Dictioanry, 然后自己只是添加, 然后依赖于顺序, 等你离职了, 别人还会按照你想的来吗? 做学术就得要精, 不知为不知, 只是为知之, 不懂装懂的人最可恶了。
引用 70 楼 的回复:

引用 64 楼 的回复:

引用 59 楼 的回复:

这个置顶帖子是什么意思? 晒一楼的无知无畏+顽固……
[/Quote]

还嘴硬, 你这是依赖于微软的内部实现。 加入微软有一天在一个新的framework版本中修改这个实现。 你的程序还会预期工作吗?
「已注销」 2012-07-21
  • 打赏
  • 举报
回复
执着于编程梦想的,热爱.NET技术的,关注CLR运行机制的.NET程序员们,,,欢迎大家踊跃加入 155672239(.NET核心大本营)。让我们一起学习,一起进步,一起追逐自己的梦想......真诚期待您的加入!
freehei 2012-07-20
  • 打赏
  • 举报
回复
笑而不语
jauney 2012-07-20
  • 打赏
  • 举报
回复
此贴真乱!!!!
潇洒王子 2012-07-20
  • 打赏
  • 举报
回复
高人很多,小弟学习了
xcy0316 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
拿事实说话,楼上的某些人该闭嘴就闭嘴。自己测去

Dictionary<object, int> m = new Dictionary<object, int>();
for (int i = 0; i < 10; i++)
{
m.Add(new object(),i);
}
foreach (var item in m)
{
Console.W……
[/Quote] 0.0~
cxz_azhong4812 2012-07-19
  • 打赏
  • 举报
回复
回复内容不能为空,请输入回复!

代码誊写工 2012-07-17
  • 打赏
  • 举报
回复
看得俺都泪奔了,真想哭啊,俺刚刚才开始学些.Net开发,以前俺就是个对社会没啥贡献的销售,就是去忽悠政府啊、国企啊买些没用的IT产品和花钱搞些面子工程的那种人。直到和一个哥们儿一起开了个小公司,实在招不到人(俺们公司可是开了6000-15000找有一两年经验的底子扎实的人,居然没有找到),只好学着当程序员,4月份开始买了《Visual Basic 2010入门经典》,另外一个哥们做底层(我个人认为那才算技术,虽然他总说这都是别人的技术,他目前只是拿来用)。
看到这个帖子的名字,并且还在首页,还以为解决了俺的一些问题呢?俺一直想知道微软这些数据结构的Hash效率如何,和DataTable的主键采用的有何不同,不同的对象类型是否采用不同的算法,对内存的耗费怎样?冲突解决是怎样的?因为俺们公司的数据采集器动辄就是几百万到几千万条记录一个表,一天就得创建几千个新表,(做网络数据分析的就这样),所以天天我都在找老师学习。
中国怎么就这样呢?两个小朋友,买了台微软电视机厂生产的.Net牌电视机,每个人看了说明书不同的部分,发现了不同可以设置电视机的搜台方法,就吵了起来,说对方没有学问。我还以为有人发明了一个电视机,哪怕是一个更灵敏的天线也行啊。
数据结构大学里就学了(俺在大学里净混日子,屁也没学到,现在在看书补习),既然是Hash,在内存里肯定是按Hash值的顺序排列,再怎么删啊、增啊,这个顺序怎么会变?至于微软的这两个数据结构也许加了一层,也许没加,关键是这个算法效率怎样,内存占用怎样,冲突多和少,用什么方式解决冲突,谁能设计出更好用算法(这个问题值得研究一下,有兴趣的就在这个帖子讨论讨论,然俺学习学习)
那天在这里看到了新量子计算机发布了,咱们就居然有人问,这个经济效益咋样,没钱他们怎么办,我靠,昨天晚上才看电视关于探测星系,那个估计近100年都只出不入,人家就那么傻嘛?就咱们聪明?
目前咱们有没有可以全球流行(哪怕有1万用户)的编程语言?没有!有没有以中国的算法理论为原型的流行的算法?没有!有没有什么开源(不开也行)社区是为业界做出贡献的,被大家承认的?也许有吧?有吗(LVS是不是)?
好好回答问题呗,要不就好好讨论,要不就好好学习,咱们的国家IT工程师没啥资格装牛X,基本都是编码函数誊写工,虚心使人进步,况且咱们跟着人家屁股后面远得很呢?没有资格谈落后。
代码誊写工 2012-07-17
  • 打赏
  • 举报
回复
在查找微软对这两个数据结构解决Hash冲突所采用的方法时,看到了一个帖子,觉得写的不错,请看看!http://www.cnblogs.com/jhh0111/archive/2008/10/23/1318223.html
快溜 2012-07-17
  • 打赏
  • 举报
回复
我是来翻页的。
叫我三三 2012-07-17
  • 打赏
  • 举报
回复
MSDN的原话
Dictionary<TKey, TValue> 的容量是 Dictionary<TKey, TValue> 可以包含的元素数。 向 Dictionary<TKey, TValue> 添加元素时,将通过重新分配内部数组,根据需要自动增大容量。
对于枚举而言,字典中的每一项都被视为一个表示值及其键的 KeyValuePair<TKey, TValue> 结构进行处理。 项返回的顺序未定义

bwangel 2012-07-16
  • 打赏
  • 举报
回复
我个人以为:用大规模的Dictionary作数据源去绑定控件的习惯是不地道的。一般都是用IList<>足矣。
Dictionary不是用来绑定大批量列表数据源的,虽然它可以这么做,但这显然是杀鸟用牛刀。而且在顺序敏感的场合,需要频繁增删改的场合,它更不适用!

Dictionary一般用来存放一些配置信息,如键值对什么的。个数是有限的。
  • 打赏
  • 举报
回复
晕,谁说 Dictionary 是有序的啊...
kudo5056 2012-07-15
  • 打赏
  • 举报
回复
Object类作为所有对象类的爸爸类,对象的hashCode()也是舶来爸爸的中的hashCode值,当然对象有权利重写hashCode()方法,给定本对象的hashCode的计算方法
  • 打赏
  • 举报
回复
而对于Dictionary<K,T>而言,我们知道它兼容了 IDictionary<K,T>、IEnumerable<KeyValuePair<TKey, TValue>>等接口,既有 Hash 方法的效率,又有良好的扩展性(例如支持Linq等等)。好!
加载更多回复(78)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧