HashMap、Hashtable、ConcurrentHashMap的区别

HashMap、Hashtable、ConcurrentHashMap的区别

HashMap

  • 线程不安全
  • 继承自AbstractMap类
  • 允许一个NULL键和多个NULL值
  • 初始size为16 扩容:newsize = 2n

Hashtable

  • 线程安全,它的每个方法中都加入了synchronized
  • 继承自Dictionary类
  • 不允许NULL键和NULL值
  • 初始size为11, 扩容:newsize = 2n+1
  • 实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化

ConcurrentHashMap

  • 线程安全的HashMap的实现(jdk1.5)
  • 不允许NULL键和NULL值
  • ConcurrentHashMap引入了一个"分段锁"的概念,具体可以理解为把一个大的Map拆分成N个小的Hashtable,根据key.hashCode()来决定把key放到哪个Hashtable中
  • 在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中,不用锁定整个Map,只锁定这个segment即可

同为线程安全,Hashtable和ConcurrentHashMap有什么分别呢?

  • 它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候(Hashtable里使用的是synchronized关键字),性能会急剧下降,因为迭代时需要被锁定很长的时间
  • 因为ConcurrentHashMap引入了分割(segment),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map
  • 简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map
posted @ 2018-11-14 18:02 青衫仗剑 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值