HahMap 与 ConcurrentHashMap 对比

概述


HashMap是基于哈希表的Map接口的非同步实现,底层是数组和链表的结合。


ConcurrentHashMap Java5中是一个支持高并发的高性能的HashMap实现,它支持完全并发的读以及一定程度并发的写。


HashMap具体实现


HashMap有3个比较重要的参数:

capacity:容量,就是数组大小
loadFactor:加载因子,用于扩容(默认0.75)
threshold:=capacity*loadFactor   最多容纳的Entry数,如果当前元素个数多于这个就要扩容(capacity扩大为原来的2倍)


它将Key_value当成一个整体--Entry对象进行处理,当需要存储一个Entry对象时,会根据hash算法来决定其在数组中的存储位置,如果那个位置有数据就插入到链表的表头,当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。


ConcurrentHashMap具体实现


ConcurrentHashMap将整个Hash表进行了分段(默认是16个segment),每个段就是一个Hashtable,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

它允许多个读操作并发进行,读操作并不需要加锁。对Hash链进行遍历不需要加锁的原因在于链指针next是final的。

有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。

对于put操作,可以一律添加到Hash链的头部。但是对于remove操作,可能需要从中间删除一个节点,这就需要将要删除节点的前面所有节点整个复制一遍,最后一个节点指向要删除结点的下一个结点。


总结

(1)ConcurrentHashMap对整个Hash表组进行了分段,而HashMap则没有
(2)ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。


参考

http://blog.csdn.net/xuefeng0707/article/details/40834595

http://blog.csdn.net/zldeng19840111/article/details/6703104

http://www.blogjava.net/qileilove/archive/2013/09/23/404308.html

http://www.iteye.com/topic/344876

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap和ConcurrentHashMap都是Java中的Map接口的实现,它们之间有以下几点区别: 1. 线程安全性:HashMap是非线程安全的,而ConcurrentHashMap是线程安全的。在多线程环境下,多个线程可以同时对ConcurrentHashMap进行读写操作,而不会导致数据不一致或者抛出异常。 2. 锁机制:HashMap使用的是悲观锁机制,即在进行写操作时需要对整个HashMap进行加锁,这样会导致并发性能下降。而ConcurrentHashMap使用的是分段锁(Segment),将整个Map分成多个段(Segment),每个段都有一个独立的锁,不同的线程可以同时对不同的段进行操作,从而提高并发性能。 3. 迭代器弱一致性:在HashMap中,如果在迭代过程中对HashMap进行修改,可能会导致ConcurrentModificationException异常。而ConcurrentHashMap的迭代器是弱一致性的,它不会抛出ConcurrentModificationException异常,但是不能保证迭代器返回的元素是最新的。 4. 初始化容量和扩容机制:HashMap在初始化时需要指定初始容量,并且在容量不足时会进行扩容。而ConcurrentHashMap可以在初始化时不指定初始容量,默认为16,并且在扩容时只对部分段进行扩容,而不是整个Map。 5. 性能:在单线程环境下,HashMap的性能可能会略优于ConcurrentHashMap,因为ConcurrentHashMap需要维护额外的线程安全机制。但在多线程环境下,ConcurrentHashMap的性能通常会优于HashMap。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值