ConcurrentHashMap

ConcurrentHashMap 是一个并发散列映射表的实现,它允许完全并发的读取,并且支持给定数量的并发更新。
相比于 HashTable 和用同步包装器包装的HashMap(Collections.synchronizedMap(new HashMap())),ConcurrentHashMap 拥有更高的并发性。
在 HashTable 和由同步包装器包装的 HashMap 中,使用一个全局的锁来同步不同线程间的并发访问。同一时间点,只能有一个线程持有锁,
也就是说在同一时间点,只能有一个线程能访问容器。这虽然保证多线程间的安全并发访问,但同时也导致对容器的访问变成串行化的了。
在使用锁来协调多线程间并发访问的模式下,减小对锁的竞争可以有效提高并发性。有两种方式可以减小对锁的竞争: 减小请求同一个锁的频率。
减少持有锁的时间。 ConcurrentHashMap 的高并发性主要来自于三个方面:

Read More

HashMap

概要

在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,
当桶中元素较多时,通过key值查找的效率较低。

在极端情况下可能会存在某个链表很长,整个时候整个查找效率就变低了,于是有了1.8的改进方式。使用红黑树,提升查询效率。

而JDK1.8中,HashMap采用位桶+链表+红黑树实现,如果哈希表单向链表中元素超过8个,那么单向链表这种数据结构会变成红黑树数据结构。
当红黑树上的节点数量小于6个,会重新把红黑树变成单向链表数据结构。

数组

存储区间是连续,且占用内存严重,空间复杂也很大,时间复杂为O(1)。

Read More