前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谈谈HashMap、Hashtable和ConcurrenHashMap

谈谈HashMap、Hashtable和ConcurrenHashMap

作者头像
帅地
发布2018-08-30 11:54:07
1.5K0
发布2018-08-30 11:54:07
举报
文章被收录于专栏:苦逼的码农苦逼的码农

坚持 再坚持 总会更加幸运

今天,我们来谈谈HashMap, Hashtable和ConcurrentHashMap在使用上的一些区别。

如果你还不知道HashMap的工作原理,建议看看

HashMap的存取原理你知道多少

先谈谈HashMap和Hashtable的区别

它们两个在工作原理上几乎是一样的。它们两个的区别主要体现在:对键值对的要求、线程的安全性,迭代器的选择以及速度上。

1.对键值对的要求

在进行集合的put(key, value)操作时,对于HashMap来说,它允许key和value的值可以是null。但是,Hashtable则对key和value有要求,不允许key和value为null

2.线程的安全上

HashMap是非同步的(synchronized),这也意味着,HashMap在进行插入、删除等操作的时候,是线程不安全的,如果自己没有在程序上对HashMap进行同步的处理,则不能让多个线程共享一个变量。如下图(没有加同步锁)

但,Hashtable是线程安全的,这也意味着可以在多个线程的环境上,共享一个变量。不过,需要提出的是,Hashtable是在每个方法前面加一个锁的。如下图

使用迭代器上的区别

HashMap的迭代器(Iterator)是使用fail-fast机制的(快速失败机制),而Hashtable的迭代器(enumerator)使用的是fail-safe机制(快速安全)。如果不知道fail-fast与fail-safe,建议看看我的另一片文章:

谈谈fail-fast与fail-safe

处理速度上的区别

居然Hashtable在线程安全方面要比HashMap强,那么在其他的方面自然要比它弱。由于Hashtable是线程安全的,同步的,那么在单线程的情况下,它的处理速度是要比HashMap慢的。

但是,就算在多线程环境下,我们也不使用Hashtable,Hashtable的同步锁是加在方法名前面的,意味着它把整个方法的代码都给锁的,所以在处理速度上是特别慢的。所以在多线程的环境下,我们优先使用另一个集合:ConcurrentHashMap,这个集合在工作原理上几乎和前面两个一样,但它是线程安全的,并且它不像Hashtable那样,把整个方法都给加锁,而是在方法里面的关键代码上加同步锁,如图:

所以,它在处理速度上比Hashtable要快,但比HashMap慢,可以说,ConcurrentHashMap是HashMap和Hashtable的折中方案。

下面解释一下什么是同步(synchronization):

假如我们在一个方法前面加了同步锁,那么在多线程的环境下,如果有一个线程1正在执行这个方法里面的代码(也就是所,这个线程获得了同步锁)。那么其他线程则不能进去执行这个方法里面的代码,直到线程1把这个方法里面的代码全部执行完,并且退出这个方法(释放同步锁),那么其他的线程在获得同步锁之后才能执行这个方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅地玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档