Current并发包(二) - CurrentMap
ConcurrentMap
提供了并发并且安全的方式来读写数据
ConcurrentHashMap
红黑树
红黑树的本质
红黑树本质是一棵自平衡的二叉树
二叉查找树的特点
左子树小于根,右子树大于根
在JDK1.8中,为了提高增删效率,
ConcurrentHashMap
引入了红黑树机制当桶中的元素个数超过8个的时候,桶中的链表会扭转成一棵红黑树
如果红黑树的节点个数不足7个,那么红黑树会扭转成链表
在
ConcurrentHashMap
中树化的条件是桶的个数 >= 64个
红黑树的特点
所有的节点的颜色非红即黑
根节点必须是黑节点
红节点的子节点必须是黑节点,但是反之不成立
最底层的叶子节点必须是黑的空节点
从根节点到任意一个叶子节点途经的黑节点个数必须一致,即黑节点高度一致
/新添节点的颜色一定是红色
红黑树的修正
涂色:
父节点为红色,并且叔父节点为红,那么需要将父节点以及叔父节点涂黑,然后将祖父节点涂红
左旋:
父节点为红,叔父节点为黑,并且当前节点为右子叶,那么需要以当前节点为轴左旋
右旋:
父节点为红,叔父节点为黑,并且当前节点为左子叶,那么需要以父节点为轴右旋
红黑树的时间复杂度是O(logN)
ConcurrentNavigableMap -并发导航映射
1.这个映射中提供了截取子映射的方法 --- headMap/ ailMap/subMap
2.
ConcurrentNavigableMap
本生是一个接口所以通常使用它的实现类ConcurrentSkipListMap
---并发跳跃表映射 - 底层基于跳跃来实现的
跳跃表
跳跃表要求元素必须有序
跳跃表可以形成多层,但是最上面的跳跃表中元素个数至少要两个
跳跃表适合于查询多的场景
跳跃表本省是一个典型的以空间换时间的产物
在跳跃表中如果是新增节点,这个节点是否要提取到跳跃表中,遵循
抛硬币
原则跳跃表的空间复杂度是O(logN)
ConcurrentNavigableMapDemo.java
package com.wiscom.map; public class ConcurrentNavigableMapDemo { public static void main(String[] args) { // 创建映射 ConcurrentNavigableMap<String, Integer> map = new ConcurrentSkipListMap<>(); // 添加元素 map.put("g", 3); map.put("a", 6); map.put("s", 7); map.put("y", 0); map.put("e", 5); map.put("w", 8); System.out.println(map); // 截取子映射 // 从头开始截取到指定的位置 System.out.println(map.headMap("e")); // 从指定位置开始截取到尾部 System.out.println(map.tailMap("e")); // 从指定位置开始截取到指定位置 System.out.println(map.subMap("e", "w")); } }
保存redis相关笔记