
HashMap
文章平均质量分 86
亿棵松
你好呀,java从业者,日常踩坑笔记
展开
-
ConcurrentHashMap 1.8源码分析
分析下1.8的ConcurrentHashMap是怎么进行实现的,怎么保证数据安全的,跟1.7的差别在哪,做了哪些优化,还是从构造方法开始看吧构造参数简单看下得到的是并发粒度默认的是1,初始化的容量含义跟之前的HashMap存在差别,之前是在*加载因子,现在直接作为实际的容量,去除以加载因子,得到需要初始化的数组长度,接下来还是看下put方法逻辑吧简单总结下,跟1.7的差别是不使用分段锁了,如果没有hash冲突直接cas替换下,不成功的话,再锁头节点进行安全操作,在synchronized里面操作,然后原创 2023-08-17 15:31:06 · 137 阅读 · 0 评论 -
ConcurrentHashMap1.7 源码浅析
分析过HashMap的1.7的版本的结构,但是HashMap是线程不安全的,多线程触发扩容还会发生死循环问题,那么ConcurrentHashMap 就是解决这个问题的,这是一个线程安全的Map,那么对应的内部实现是怎么样的,简单分析下,和HashMap相同的位置就不多做重复分析了这是个最基础的构造方法,需要的参数有容量,扩容因子,这是和HashMap相同的地方,但是多了一个并发水平选项,这里默认值是16,也就是并发粒度的控制,最多可以16个线程同时加锁对Map处理,我们看下具体怎么做的。从构造方法来看,原创 2023-08-04 09:55:09 · 182 阅读 · 0 评论 -
HashMap1.8原理浅析
HashMap的结构和原理经常会被问到,比较经典的结构存储,1.8又对之前1.7做了较大优化,所以经常放在一起对比,这里分析下1.8的实现,并且总结下和1.7之间的差别。构造方法里面基本一致,就是赋值下对应的容量和扩容因子,不过对比1.7的确认数组长度提前,计算长度算法改变了下,不影响大局比较关键的还是HashMap的put方法,可以说是map里面的核心,下面来看下put的实现这里put的流程简单总结下,如果数组未初始化先调用resize进行初始化,然后计算对应的位置,如果hash不冲突直接存入,has原创 2023-08-02 21:46:09 · 292 阅读 · 0 评论 -
HashMap源码阅读(二,关键方法理解)
HashMap(jdk1.8)HashMap的初始化容量,当输入为25的时候,n等于24,转成二进制为1100,右移1位为0110,将1100与0110进行或("|")操作,得到1110。接下来右移两位得11,再进行或操作得1111,接下来操作n的值就不会变化了。最后返回的时候,返回n+1,也就是10000,十进制为32。按照这种逻辑得到2的n次幂的数,容量为int类型,int的范围内的所有数,经过方法的位运算都会产生2的N次幂,HashMap的容量总是2的n次幂,利于HashMap后续查找。/**原创 2020-09-16 09:49:34 · 122 阅读 · 0 评论 -
HashMap源码阅读(一,默认的参数说明)
HashMap(jdk1.8)默认的初始化大小,当不指定Map的大小的时候默认值 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16默认的负荷系数,其实就是HashMap用到的需要阔容的阈值,默认为0.75,无特殊要求最好不动他,比如HashMap的容量是16,负荷系数是0.75,那么当map里面存了12个值的时候已经达到了需要阔容的阈值,当再新增值的时候,会发生阔容,值的大小影响到map的hash碰撞原创 2020-09-14 18:33:56 · 213 阅读 · 0 评论