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添加到计数中,为下次调整做准备。

相关推荐
明志数科18 分钟前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
_qingche24 分钟前
H2 数据库到 MySQL 数据迁移
java·数据库·spring boot·mysql·spring·重构·kotlin
AOwhisky34 分钟前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算
可乐ea1 小时前
【知识获取与分享社区项目 | 项目日记第 21 天】索引构建与联想建议:Outbox 增量更新 + Completion Suggester
java·大数据·mysql·elasticsearch·搜索引擎
RainCity1 小时前
Java Swing 自定义组件库分享(十一)
java·笔记·后端
好家伙VCC1 小时前
Qdrant + LangChain 实战:构建毫秒级语义检索服务
java·langchain
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
try2find1 小时前
Agent学习之补充my_plan_solve_agent
学习
摇滚侠1 小时前
JDBC 基础到高级一套通关!高级篇 28-40
java
想你依然心痛2 小时前
HarmonyOS 6(API 23)实战:打造“光码智学舱“——AI编程学习新范式
学习·ar·ai编程·harmonyos·智能体