Map接口的实现类

除了最常用的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
        implements Map, Serializable {
        private static final long serialVersionUID = 1978198479659022715L;

        private final Map m;     // Backing Map
        final Object      mutex;        // Object on which to synchronize
        // .......
}

关键在于包装了原来的集合对象,添加了一个用于同步的对象,在实现Map的所有方法的时候,内部都要先获取mutex对象的锁,以此同步。

ConcurrentHashMap

  • 线程安全的Map实现类,内部结构与HashMap类似,但对HashMap里的table数组进行了分段。
  • 分段是为了分段加锁,这就是它和HashTable等其它同步Map类最大的不同,而且由于分段,所以并发度也就是段数,默认16
  • fail safe iterator,不抛出异常

你可能感兴趣的:(Map接口的实现类)