Java·Hashtable、HashMap、Concurren

2019-04-26  本文已影响0人  Sarahhhh

关于HashMap详请见Java·hashmap
本文主要讲讲三者的区别

对比项 HashMap ConcurrentHashMap Hashtable 说明
基类 AbstractMap AbstractMap Dictionary 都实现了Map接口
数据结构 数组+链表 数组+链表 数组+链表
存储字段 Node<K,V>[] table (volatile)Node<K,V>[] table Entry<?,?>[] table 都实现了Map.Entry<K,V>接口
初始大小 16 16 11 尽量使哈希表的大小为奇数、素数
扩容策略 newsize = oldsize*2 newCap = oldCap << 1 参考 newCapacity = (oldCapacity << 1) + 1 当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀
null键null值 允许,键为null的放在table[0]的哈希桶中 不允许 不允许 并发的都不允许参考
迭代器 Iterator(是 fail-fast 迭代器) enumerator(不是 fail-fast 迭代器) enumerator迭代key或value,Iterator迭代Entry(有 fail-fast 机制)参考
CAS自旋赋值+synchronized同步+LockSupport阻塞等手段,效率高 synchronized同步关键字,锁住整张表,效率低

ConcurrentHashMap锁

JDK7里面采用分段锁,最大并发个数就是Segment的个数,默认值是16,这个值就是并发的粒度;
JDK8里面,去掉了分段锁,而采用更细粒度的table元素级别,也就是说只需要锁住这个链表的head节点,并不会影响其他的table元素的读写,好处在于并发的粒度更细,影响更小,从而并发效率更好

ConcurrentHashMap扩容时的读写操作

参考链接:
深入理解HashMap+ConcurrentHashMap的扩容策略
Hashtable 的实现原理
HashMap和Hashtable的区别
面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别

上一篇 下一篇

猜你喜欢

热点阅读