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<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,不抛出异常
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 接口/抽象类意义规范、扩展、回调为其子类提供一个公共的类型 封装子类中得重复内容 定义抽象方法,子类虽然有不同的实...
    MigrationUK阅读 6,572评论 1 28
  • List list(表)继承Collection(集合)接口,主要有Arraylist,LinkedList和Ve...
    fredal阅读 5,769评论 2 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,991评论 18 399
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    独念白阅读 4,247评论 0 2
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    Oneisall_81a5阅读 4,369评论 0 11