前面简单说了一下Map,这里简单的总结一下。
HashMap
数据结构
数组+链表+红黑树。
优点
理想状态下:插入和查找时间复杂度为O(1)。
缺点
- 无序:既不能按照访问循序排序,也不能根据插入循序进行排序。
- 不支持高并发:在多线程情况快,其扩容机制会出现死循环。
所以根据这两个缺点,开发人员又编写了相对应的Map类
有顺序的Map——LinkedHashMap
数据结构
因为是有序的,所以在HashMap的基础上,添加了双向链表。
所以其数据结构为:数组+双链表+红黑树。
同时不仅仅支持插入有序,其字段accessOrder(boolean)可以开启LRU规则,按照访问次数进行排序。
/**
* The iteration ordering method for this linked hash map: <tt>true</tt>
* for access-order, <tt>false</tt> for insertion-order.
* true:查找顺序,false:插入顺序
* @serial
*/
final boolean accessOrder;
优点
在HashMap的基础上实现了有序存储。
缺点
同HashMap一样:不支持高并发。
高并发Map_1:ConcurrentHashMap
ConcurrentHashMap是用的最多的处理高并发的HashMap
数据结构
我们可以看到ConcurrentHashMap继承了AbstractMap实现ConcurrentMap。
而ConcurrentMap继承了Map。
所以除了在实现高并发处和HashMap有所不同,器数据结构也是数组+链表。
优点
- 使用了CAS算法,可处理高并发。且速度较快。
- 在处理一条数据的时候,可以对其他数据进行操作。
缺点
无序
高并发Map_2:synchronizedMap
数据结构
与前面的兄弟不同,synchronizedMap是Collollections类中的。通过阅读源码可知,synchronizedMap通过synchronized锁住了对象,并不是整个方法。调用的方法还是Map的。所以同样是数组+链表。
优点
可处理高并发
缺点
速度比ConcurrentHashMap慢很多,而且不支持有序
高并发Map_3:Hashtable
虽然Hashtable废弃了,但是还是说一下吧
数据结构
Hashtable只是在方法前加上synchronized,底层就是HashMap。所以是数组+链表+红黑树。
优点
可处理高并发
缺点
- 慢。
- 在处理一个数据的时候,整个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()对“键”进行比较的散列映射。专为解决特殊问题而设计的 |