1. HashMap

Entry,一对kv就是一个Entry,还包括一些next指针,用来解决散列冲突。

table,内部用来存储Entry的数组,resize时候table会成倍扩容。

容量,table数组的长度。

装填因子,当key的数量大于table.length*装填因子就要进行扩容,默认75%。

resize操作,同步的重新计算一遍hash值对应的新的slot

Put操作

和所有hashmap一样,都是计算hash值,检查容量,映射到slot。当发生冲突的时候会往entry链表的后面插入。

不过,java还做了一个优化,这个链表长度当大于8个的时候会把他优化成一个有序的Tree。

Get操作

根据hash值找到slot,然后比较第一个Entry是不是要找的kv,不是的话,就沿着next指针的Entry往下找。

如果,发现是个Tree不是链表,直接做有序的查找

2. ConcurrentHashMap

以下和HashMap相同的地方就不说了

问题,ConcurrentHashMap多线程情况下怎么初始化table,以及table在多线程情况下resize

解决,

有一个sizeCtl的属性,这个属性只可能是0或者-1,通过CAS,只有一个线程把他设置成-1。

其他没设置成功的线程调用Thread.yield,原话是“lost initialization race; just spin”

问题,Put的时候slot之前没有值,怎么防止多个线程同时设置新值

解决,

尝试用CAS更新一次这个空的位置,更新失败的时候,对slot上的第一个Node加锁,用插入到链表或者TreeNode

问题,Put以后要size++

解决,

这里没有使用AtomicInteger,而是把每个slot对应一个CounterCell代表这个slot下Entry的数量,这里没读懂为什么使用CounterCell

问题,resize相关的策略

解决,

之前用装填因子和数量来判断是否需要resize,java8是通过是否有散列冲突来扩容。

与redis的策略一样,java8也是采用渐进性哈希的方式。

HashMap 和 ConcurrentHashMap,Java1.8版本的更多相关文章

  1. 轻松理解 Java HashMap 和 ConcurrentHashMap

    前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 ...

  2. HashMap HashTable ConcurrentHashMap

    1. Hashtable 和 HashMap (1)区别,这两个类主要有以下几方面的不同:Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽 ...

  3. 高并发第九弹:逃不掉的Map --> HashMap,TreeMap,ConcurrentHashMap

    平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map ...

  4. Hashtable 和 HashMap 以及 ConcurrentHashMap

    备忘: ConcurrentHashMap与Hashtable的区别: Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作:而ConcurrentHash ...

  5. 深入理解HashMap和concurrentHashMap

    原文链接:https://segmentfault.com/a/1190000015726870 前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇 ...

  6. 沉淀再出发:java中的HashMap、ConcurrentHashMap和Hashtable的认识

    沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下 ...

  7. HashTable、HashMap与ConCurrentHashMap源码解读

    HashMap 的数据结构 ​ hashMap 初始的数据结构如下图所示,内部维护一个数组,然后数组上维护一个单链表,有个形象的比喻就是想挂钩一样,数组脚标一样的,一个一个的节点往下挂. ​ 我们可以 ...

  8. HashMap?ConcurrentHashMap?

    Java团长在csdn 2019-02-06 19:58:00  104241  收藏 666     来源:crossoverJie(ID:crossoverJie) 前言 Map 这样的 Key ...

  9. [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...

  10. HashMap和ConcurrentHashMap流程图

    本文表达HashMap和ConcurrentHashMap中的put()方法的执行流程图,基于JDK1.8的源码执行过程. HashMap的put()方法: ConcurrentHashMap的put ...

随机推荐

  1. Orcale 之子查询

    子查询和连接查询一样,都提供了使用单个查询访问多个表中的数据的方法.子查询在其他查询的基础上,提供一种进一步有效的方式来访问数据. IN 关键字 使用 IN 关键字可以将原表中特定的的值与子查询中返回 ...

  2. vue基础知识之vue-resource/axios

    Vue基础知识之vue-resource和axios(三)   vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...

  3. jstl缺包时的报错

    jsp中:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  报错: ...

  4. .netCore2.0 程序集DI依赖注入

    传统的依赖注入确实简单,但是随着项目的扩展随之而来的问题又来了,因为传统的注入是单个类和接口注入的,加入项目的接口和类增加到了上百个的话,就需要在Startup.cs中复制注入上百次,虽然能解决问题, ...

  5. Config 代码片段

    class Config { private static Config _instance = null; public static Config Instance { get { if (_in ...

  6. 如何学习OpenStack

    转自:http://www.chenshake.com/learn-how-openstack/ 如何学习OpenStack 由于工作的关系,也招收实习生,希望可以通过实习生的培养,让他们对Opens ...

  7. PHP学习4——面向对象

    主要内容: 创建类 成员方法 构造方法 析构方法 封装 继承 接口 多态 静态成员 常用关键字 常用魔术方法 从PHP5开始引入了面向对象的全部机制,面向对象的特性符合软件工程的3个目标:重用性,灵活 ...

  8. php中cookie的操作

    php设置和获取cookie 创建cookie setcookie('mycookie','value',time()+86400);//参数3 cookie过期时间//函数原型:int setcoo ...

  9. Oracle 数据库字典 sys.obj$ 表中关于type#的解释

    sys.obj$ 表是oracle 数据库字典表中的对象基础表,所有对象都在该表中有记录,其中type#字段表明对象类型,比如有一个表 test ,则该对象在sys.obj$ 中存在一条记录,name ...

  10. 复活hexo静态博客的方法

    我的个人博客http://webhmy.com/是通过hexo搭建的,它支持图片显示,支持md,无需主机空间,可以满足我的大部分需求.但是在2年的使用的过程中遇到一些问题,这里记录下来.便于下次快速复 ...