目录
2.10. ConcurrentReferenceHashMap
一. 前言
Map是一个顶级接口类,该类没有继承任何其他接口。该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。
二. 实现类
2.1. HashMap
无序、不重复、无索引;非线程安全
HashMap跟HashSet的底层原理是一摸一样的,都是哈希表结构。
详情请参见《HashMap 源码解析》。
2.2. LinkedHashMap
有序、不重复、无索引;
这里的有序指的是保证存储和取出的元素顺序一致;
原理:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
详情请参见《LinkedHashMap 源码解析》。
2.3. ConcurrentHashMap
线程安全的HashMap。
JDK1.7:基于分段锁实现
JDK1.8:采用synchronized + CAS + 红黑树来实现
2.4. TreeMap
TreeMap实现了SortMap()接口,基于红黑树对所有key进行排序。
排序方式:自然排序和定制排序。
TreeMap的key以TreeSet的方式存储,对key的要求与TreeSet对元素的要求大体一致。
详情请参见《TreeMap 源码解析》。
2.5. Hashtable
线程安全,key不允许为null,性能较HashMap低。目前一般不推荐使用。
2.6. WeakHashMap
WeakHashMap是一种弱引用的map,底层数据结构为数组+链表,内部的key存储为弱引用,在GC时如果key不存在强引用的情况下会被回收掉,而对于value的回收会在下一次操作map时回收掉,所以WeakHashMap适合缓存处理。
详情请参见《WeakHashMap 源码解析》。
2.7. IdentityHashMap
IdentityHashMap与HashMap类似,IdentityHashMap也允许使用null,但不能保证键值对顺序。
区别:
IdentityHashMap使用==来判断key是否相等,HashMap使用equals来判断key是否相等。
2.8. EnumMap
EnumMap是一个Map,但是它的key是enum类型的。这个map的size有最大值,就是enum的个数。
2.9. ConcurrentSkipListMap
简单来说ConcurrentSkipListMap是TreeMap的并发实现,但是为什么没有称之为ConcurrentTreeMap呢?这和其自身的实现有关。该类是SkipLists的变种实现,提供了Log(n)的时间开销:containsKey、get、put、remove。Insertion, removal, update, and access等操作都是线程安全的。迭代器是弱一致性的,升序迭代器比降序的快。该map的size方法不是常量时间开销,需要遍历,所以这个值在并发的时候可能不准。该map也不允许空键或值。
2.10. ConcurrentReferenceHashMap
1. 支持高并发,基于分段锁实现,性能优于Hashtable
2. 和ConcurrentHashMap设计约束一致,但是支持key和value都为null
3. 默认引用方式为弱引用,非常适合用来做缓存
4. 发生gc的时候,任何时候的缓存对象有可能会被回收,相当于有一个线程在删除内存中的对象