ConcurrentHashMap
⭐static final int spread(int h) {
return (h ^ (h >>> 16)) & HASH_BITS;
}
对key进行hash运算,中心思想无非就是高位移向低位减少hash冲突
⭐public V put(K key, V value)
1.首先会判断key与value是否为Null,如果为Null则抛异常;(这也是ConcurrentHashMap与HashMap的区别,ConcurrentHashMap不允许key或value为Null)
2.通过hash码与ConcurrentHashMap的槽点长度进行模运算,找到槽点具体位置,判断该位置是否有元素
如果没有元素,则通过CAS的方式将要添加的元素,放到该槽点位置;
如果有元素,则拿到该槽点下面的链表,并且synchronized将该链表锁住,并且从头开始进行遍历,如果找到则将旧值进行替换,如果没找到则添加到链表尾部;
3.最后判断该链表的长度是否大于等于8,如果大于等于8,则需要将链表转换成红黑树;
⭐public V remove(Object key)
1.对要删除的key进行hash计算
2.通过计算hash值与数组长度模运算找到槽点数组上的具体槽点位置
2.1如果这个槽点上数据为NULL,则直接返回
2.2如果这个槽点上有数据,那么将该槽点链上的链表或红黑树synchronized ()锁起来,最后从头到尾进行对比key是否相等,中
复习ConcurrentHashMap增删改查
最新推荐文章于 2024-06-06 08:19:10 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)