ConcurrentHashMap源码学习

实现接口

ConcurrentMap(Map的基础方法)、Serializable(序列化)

基础属性

最大容量:2^30

默认容量:16

常用方法

PUT

调用PutVal方法进行插入。

判断key或value是否为空:

是:抛出空指针一场

否:将key的哈希值的上下16位进行异或,是哈希值更散列

判断节点数组是否为空:

是:初始化节点数组,并将容量恢复至默认容量16

否:利用tabAt方法获取hash分配位置的值,如果节点值为null,则利用casTabAt方法将新节点插入到当前位置

否:hash分配位置的Hash值为-1(转发节点),则调用helpTransfer方法(在调整大小中进行传输)

否:onlyIfAbsent为true,hash分配位置的节点与插入节点的key相同,且value不为null,返回当前hash位置的value;

否:给到当前位置节点加锁,判断当前位置节点是否改变

否:当前位置的hash值是否大于等于0(表示正常节点哈希的可用位),寻找key是否已存在,已存在则判断onlyIfAbsent是否为false,寻找过程中binCount(链表深度)会随着每一次循环加1

是:将目标值替换旧值

break跳出循环;

不存在则将目标节点添加到末尾

如果当前hash位置的节点是树类型的节点,调用putTreeVal方法来查找和插入节点(先判断节点是否存在,存在则返回节点,不存在则插入当前节点并返回null),返回值不为null则判断onlyIfAbsent是否为false

是:将目标值替换旧值

break跳出循环;

如果当前hash位置的节点是ReservationNode类型则抛出异常

java 复制代码
throw new IllegalStateException("Recursive update")

如果binCount不等于0

binCount大于8:将所有节点转换成树节点

旧值(相同key)不为null,返回旧值。

调用account将binCount添加到计数中,为下次调整做准备。

相关推荐
xian_wwq25 分钟前
【学习笔记】攻击链贯穿端边云!边缘网络访问三大核心风险预警
笔记·学习·安全·边缘计算
CoderYanger2 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
C++业余爱好者2 小时前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
想用offer打牌2 小时前
RocketMQ如何防止消息丢失?
java·后端·架构·开源·rocketmq
皮卡龙2 小时前
Java常用的JSON
java·开发语言·spring boot·json
利刃大大3 小时前
【JavaSE】十三、枚举类Enum && Lambda表达式 && 列表排序常见写法
java·开发语言·枚举·lambda·排序
float_六七3 小时前
Java反射:万能遥控器拆解编程
java·开发语言
han_hanker4 小时前
java 异常类——详解
java·开发语言
源码获取_wx:Fegn08954 小时前
基于springboot + vue健身房管理系统
java·开发语言·前端·vue.js·spring boot·后端·spring
深蓝海拓4 小时前
PySide6从0开始学习的笔记(一) 学前班
笔记·学习