浅谈HashMap,LinkedHashMap,ConcurrentHashMap、synchronizedMap(五.总结)

前面简单说了一下Map,这里简单的总结一下。

HashMap

数据结构

数组+链表+红黑树。

优点

理想状态下:插入和查找时间复杂度为O(1)。

缺点

  1. 无序:既不能按照访问循序排序,也不能根据插入循序进行排序。
  2. 不支持高并发:在多线程情况快,其扩容机制会出现死循环。

所以根据这两个缺点,开发人员又编写了相对应的Map类

有顺序的Map——LinkedHashMap

数据结构

因为是有序的,所以在HashMap的基础上,添加了双向链表。
所以其数据结构为:数组+双链表+红黑树。
同时不仅仅支持插入有序,其字段accessOrder(boolean)可以开启LRU规则,按照访问次数进行排序。

    /**
     * The iteration ordering method for this linked hash map: true
     * for access-order, false for insertion-order.
     * true:查找顺序,false:插入顺序
     * @serial
     */
    final boolean accessOrder;

优点

在HashMap的基础上实现了有序存储。

缺点

同HashMap一样:不支持高并发。

高并发Map_1:ConcurrentHashMap

ConcurrentHashMap是用的最多的处理高并发的HashMap

数据结构

我们可以看到ConcurrentHashMap继承了AbstractMap实现ConcurrentMap。
而ConcurrentMap继承了Map。
所以除了在实现高并发处和HashMap有所不同,器数据结构也是数组+链表。

优点

  1. 使用了CAS算法,可处理高并发。且速度较快。
  2. 在处理一条数据的时候,可以对其他数据进行操作。

缺点

无序

高并发Map_2:synchronizedMap

数据结构

与前面的兄弟不同,synchronizedMap是Collollections类中的。通过阅读源码可知,synchronizedMap通过synchronized锁住了对象,并不是整个方法。调用的方法还是Map的。所以同样是数组+链表。

优点

可处理高并发

缺点

速度比ConcurrentHashMap慢很多,而且不支持有序

高并发Map_3:Hashtable

虽然Hashtable废弃了,但是还是说一下吧

数据结构

Hashtable只是在方法前加上synchronized,底层就是HashMap。所以是数组+链表+红黑树。

优点

可处理高并发

缺点

  1. 慢。
  2. 在处理一个数据的时候,整个Map被锁上,不能对其他数据进行操作,局限性太大。很不实用。

其他Map

其实还有TreeMap,WeakHashMap,但是这里就不详细说了。用的确实不多。

各个Map总结:

Map 特性
HashMap Map基于散列表的实现(他取代了Hashtable)。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以此调整容器的性能
LinkedHashMap 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入顺序,或者是最近最少使用(LRU)的次序,只比HashMap慢一点;而在迭代访问时反而更快,因为使用链表维护内部次序
TreeMap 基于红黑树的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparable或者Comparator决定)其特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,他可以返回一个子树
WeakHashMap 弱键映射,允许释放映射所指向的对象;这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此键可以被垃圾回收期回收
ConcurrentHashMap 一种线程安全的Map,他不涉及同步加锁。使用CAS算法进行实现
IdentityHashMap 使用“==”代替equals()对“键”进行比较的散列映射。专为解决特殊问题而设计的

你可能感兴趣的:(java,数据结构)