除了最常用的HashMap以外,还有一些常用的Map实现类,这里做一个与HashMap的对比
HashTable
- HashTable是同步的(synchronized函数),而HashMap不同步,所以HashTable要慢一些
- HashTable不接受null键和值,而HashMap接受一个null键和无数个null值
- 除了keySet(), entrySet(), values()这些HashMap支持的迭代之外,HashTable还支持基于Enumeration的keys(), elements(), 但是在现在他们的实现都是基于一个实现了Enumeration和Iterator接口的类。
LinkedHashMap
- 继承了HashMap,是Map接口的Hash table和linked list实现,所以在迭代的时候的顺序是已知的,这个顺序可以是插入的顺序,也可以设为最后访问,也就是说可以实现一个LRU cache
- 插入性能略低于HashMap,但迭代时要好于HashMap
TreeMap
- 内部由红黑树实现,所以是一个有序的Map接口的实现,TreeSet也是依赖TreeMap实现的。
- 类似于PriorityQueue,也是分为自然排序和定制排序
- containsKey, get, put and remove 操作时间复杂度log(n),因为这事一个自平衡的二叉查找树
Collections.synchronizedMap()
将不同步的map转换为同步的map
private static class SynchronizedMap<K,V>
implements Map<K,V>, Serializable {
private static final long serialVersionUID = 1978198479659022715L;
private final Map<K,V> m; // Backing Map
final Object mutex; // Object on which to synchronize
// .......
}
关键在于包装了原来的集合对象,添加了一个用于同步的对象,在实现Map的所有方法的时候,内部都要先获取mutex对象的锁,以此同步。
ConcurrentHashMap
- 线程安全的Map实现类,内部结构与HashMap类似,但对HashMap里的table数组进行了分段。
- 分段是为了分段加锁,这就是它和HashTable等其它同步Map类最大的不同,而且由于分段,所以并发度也就是段数,默认16
- fail safe iterator,不抛出异常