源码分析之五种Map容器的区别

1、Java中的Map容器概述

      Map是一种存储key-value(键值对)的容器,在Java中,常见的Map接口的实现类有五种,分别是HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap、TreeMap。五种容器的关系如下图:
在这里插入图片描述
      注意不能把:hash与map两个概念混为一谈,然而map是用于存储key-value的虚拟容器,按照key的hash值将节点散列到一个table数组(也称hash表)的table[i](也称hash桶)中。

2、HashMap容器

      Java中的HashMap底层使用一个table数组存放节点,使用链表(JDK 1.8新增红黑树)解决hash冲突(多个元素的hash值散列到同一个table[i]中)的问题。
在这里插入图片描述
特点:

  1. 存取高效,不支持并发读写操作(没有引入锁任何机制)
  2. table数组的长默认是16,并且每次扩容为原来的2倍(长度总是保持为2的次幂,方便hash值求余)
  3. 支持key、value为null的键值对插入

3、Hashtable容器

      Java中的Hashtable底层同样是使用一个table数组存放节点,使用链表解决hash冲突(多个元素的hash值散列到同一个table[i]中)的问题。不过引入了锁机制(通过synchronized关键字,锁为this,每次锁住整个容器),支持并发操作。
在这里插入图片描述
特点:

  1. 写入、删除效率相对较低。引入锁机制,通过synchronized关键字修饰方法(同步方法),锁对象为this,每次锁住整个容器,锁的粒度太大。
  2. table数组的长默认是11,并且每次扩容为原来的2倍 + 1
  3. 不支持key、value为null的键值对插入

4、ConcurrentHashMap容器

      Java中的ConcurrentHashMap底层同样是使用一个table数组存放节点,使用链表解决hash冲突(多个元素的hash值散列到同一个table[i]中)的问题。在JDK 1.8前的版本中引入段的概念,使用RententLock锁,并且分段锁(对每个段分别设置一个锁),相比于Hashtable锁整个容器,并发操作时,效率提高了不少。
      在JDK 1.8的时候,又取消了段的概念,重新使用synchronized关键字(同步代码块)。不过每次锁住的对象的是需要修改的table[i](hash桶),并且在各大方法中尽量减少了同步代码块中的代码量,从而减少了锁的粒度,并发操作时,效率提高了不少。在扩容时,支持多个线程同时进行扩容(并发扩容)。
JDK1.7:
在这里插入图片描述
JDK1.8:
在这里插入图片描述
特点:

  1. 写入、删除效率相比与Hashtable容器较高。引入锁机制,通过synchronized关键字(同步代码块),锁对象为即将修改的table[i](hash桶),锁的粒度小。
  2. table数组的长默认是16,并且每次扩容为原来的2倍(长度总是保持为2的次幂,方便hash值求余)
  3. 不支持key、value为null的键值对插入

5、LinkedHashMap容器

      Java中的LinkedHashMap是HashMap的子类,也可以说是对HashMap的封装。对外展示的是一个双向链表,链表中的元素顺序,就是插入节点的顺序。
在这里插入图片描述
特点:

  1. LinkedHashMap是对HashMap的进一步封装,所以实现细节基本一致
  2. 对外展示为双向链表,链表节点中的顺序为插入时的顺序(其实也可以修改为访问顺序)

6、TreeMap容器

      Java中的TreeMap容器底层是通过维护一棵红黑树来存储key-value节点,与hash没有任何关系。树中的节点按照key的大小排序,可以手动指定key的比较器comparator。
在这里插入图片描述
特点:

  1. 读写高效,查找的复杂度在O(log2n)级别。(不支持并发读写,为引入锁)
  2. 节点按照key升序排列,可指定key的比较器comparator
  3. 不支持key为null的key-value插入

7、往期佳文

7.1、面试系列

1、吊打面试官之一面自我介绍
2、吊打面试官之一面项目介绍
3、吊打面试官之一面系统架构设计
4、吊打面试官之一面你负责哪一块
5、吊打面试官之一面试官提问
6、吊打面试官之一面你有什么问题吗

······持续更新中······


7.2、技术系列

1、吊打面试官之分布式会话
2、吊打面试官之分布式锁
3、吊打面试官之乐观锁
4、吊打面试官之幂等性问题
5、吊打面试关之分布式事务
6、吊打面试官之项目线上问题排查

······持续更新中······

7.3、源码系列

1、源码分析之SpringBoot启动流程原理
2、源码分析之SpringBoot自动装配原理
3、源码分析之ArrayList容器
4、源码分析之LinkedList容器
5、源码分析之HashMap容器
6、源码分析之ConcurrentHashMap容器

7.4、数据结构和算法系列

1、数据结构之八大数据结构
2、数据结构之动态查找树(二叉查找树,平衡二叉树,红黑树)

······持续更新中······

7.5、多线程系列

1、并发系列之初识多线程
2、并发系列之JMM内存模型
3、并发系列之synchronized解析
4、并发系列之volatile解析
5、并发系列之synchronized与volatile的区别
6、并发系列之Lock解析
7、并发系列之synchronized与lock的区别

······持续更新中······


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值