美文网首页数据
Map接口的实现类

Map接口的实现类

作者: 言西枣 | 来源:发表于2016-05-22 05:13 被阅读604次

    除了最常用的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,不抛出异常

    相关文章

      网友评论

        本文标题:Map接口的实现类

        本文链接:https://www.haomeiwen.com/subject/xtqorttx.html