(点击上方的蓝色文字,可快速关注我们)

一、HashMap,即java.util.HashMap

标准链地址法实现。这个不用多解析,下图十分明了。

二、Collections.synchronizedMap() 函数返回的线程安全的HashMap

这个的实现比较简单。

代码中有:

基本所有的方法都加上了synchronized(mutex)。

但是这个HashMap不能随便地进行迭代,因为它只是简单包装了HashMap,而回看HashMap的实现,我们可以发现,对于冲突的key,形成一个链表,明显如果有一个线程在历遍HashMap,另一个线程在做删除操作,则很有可能出错。

因此,JDK中给出以下代码:

三、ConcurrentHashMap

对于HashMap,最主要的是以下四种的操作:

在多线程环境下,get,put,remove都是比较容易实现的(如果不考虑效率,简单加锁即可),迭代的操作才是真正的难点。

从Collections.synchronizedMap()的迭代来看,它并不能做到对客户代码透明,有点蛋疼。

下面简单分析ConcurrentHashMap的实现,相当精巧。

默认一个ConcurrentHashMap中有16个子HashMap,所以相当于一个二级哈希。对于所有的操作都是先定位到子HashMap,再作相应的操作。

对于:

public V get(Object key)

先得到 key所在的table,再像HashMap一样get中间并不加锁

public V put(K key, V value)

先得到所属的table,加锁

判断table是否要扩容

如果table要扩容,则产生newTable

hash值相同的slot整体移到newTable

hash值不同的slot,把oldTable中的所有Entry都复制到newTable中

因为有可能其它线程在历遍这个table,所以不能把原来的链表拆断

public V remove(Object key)

remove操作,如下图,要删除Entry3,则先复制Entry1为Entry1*,Entry1*指向Entry4,再复制Entry2为Entry2*,Entry2*指向Entry1*,最终形成一个两叉的链表。原本的Entry1,Entry2,Entry3会被GC自动回收。

迭代操作:

ConcurrentHashMap的历遍是从后向前历遍的,因为如果有另一个线程B在执行clear操作时,会把table中的所有slot都置为null,这个操作是从前向后执行如果线程A在历遍Map时也是从前向后,则有可能会出现追赶现象。

以下代码:

HashMap输出的是 key:1 key:2ConcurrentHashMap输出的是key:2 key:1

总结: Java 中的类库实在太多了,HashMap还有很多,有空再补充。


欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

长按下方的二维码可以快速关注我们


如想加群讨论学习,请点击右下角的“加群学习”菜单入群


Java集合框架HashMap和ConcurrentHashMap实现分析相关推荐

  1. java集合框架02——ArrayList和源码分析

    上一章学习了Collection的架构,并阅读了部分源码,这一章开始,我们将对Collection的具体实现进行详细学习.首先学习List.而ArrayList又是List中最为常用的,因此本章先学习 ...

  2. Java集合框架之 Java HashMap 源码解析

    继上一篇文章Java集合框架综述后,今天正式开始分析具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 签名(signature) public class HashMap<K,V> ...

  3. Java集合框架:HashMap

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. Java集合框架之三:HashMap源码解析

    Java集合框架之三:HashMap源码解析 版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集 ...

  5. Java 集合框架分析:JAVA集合中的一些边边角角的知识

    相关文章: Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:Lin ...

  6. Java集合框架之接口Collection源码分析

    本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...

  7. Java 集合框架分析:线程安全的集合

    相关文章: Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:Lin ...

  8. 容器(一)剖析面试最常见问题之 Java 集合框架

    转载自https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E ...

  9. java list有序还是无序_牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。...

    一个多月前,作者和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是:取精华,取重点.每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标 ...

  10. 史上最全的集合框架讲解 ----- Java 集合框架(3)---- Map 相关类最全解析

    引言 好了,步入正题,上篇文章Java 集合框架(2)---- List 相关类解析中我们一起看了一下 List 接口的相关具体类(ArrayList.LinkedList-.),这篇开始我们开始探索 ...

最新文章

  1. 通过History Trends Unlimited通过统计台式机Edge浏览器Top10网页历史访问量(截止至2021.11.23)
  2. docker mysql编辑器_docker官方mysql镜像自定义配置详解
  3. [分享]另一种对 IDisposable 的实现
  4. css兼容性案例:margin-top在IE6/7下失效
  5. Android基础知识之智能指针:强指针和弱指针
  6. 4 配置端口聚合提供冗余备份链路
  7. Tushare Day7—— 第19章投资组合理论及拓展
  8. 配置 manjaro
  9. 面向对象,面向对象的优点
  10. 2021年腾讯云618活动最新优惠攻略
  11. 微星主板在有RAID的情况下在NVME的SSD上安装Win10
  12. Topic7——279. 完全平方数
  13. 数据结构练习题――Hero In Maze 简单版
  14. javascript中变量的内存分配,以及const VS let
  15. jre8 最新版本下载
  16. 《Adobe Flash CS4中文版经典教程》——1.13复习
  17. NDK from ndk.dir at ndk-bundle had version [22.1.7171670] which disagrees with android.ndkVersion [2
  18. 响应式页面的实现方式
  19. Citesapace作图结果部分——文章整体思路简单分析
  20. WLAN配置二层直连隧道转发示例

热门文章

  1. 跨境网上收款 找PayPal没错(获取Client ID 和 secret)
  2. Java虚拟机(三)垃圾标记算法与Java对象的生命周期
  3. java cp命令:命令行指定需要加载的类classpath
  4. curl上传图片的大坑
  5. 移动开发的那些事(上)
  6. Camera Shutter Sound can't restore to default
  7. 原创 leetcode[454]四数相加II /4Sum II 哈希策略
  8. 如何在苹果Mac中使用聚焦搜索 NTFS 格式磁盘?
  9. 在苹果Mac上如何将zsh用作默认Shell?
  10. 在Mac中关闭应用通知的两种方法