JUC并发容器--ConcurrentSkipListMap
跳表
跳表是一种基于有序链表的数据结构,支持快速插入、删除、查找操作,其时间复杂度为O(log n),比普通链表的O(n)更高效。
跳表的特性
- 一个跳表结构由很多层数据结构组成。
- 每一层都是一个有序的链表,默认是升序。也可以自定义排序方法。
- 最底层链表(图中所示Level1)包含了所有的元素。
- 如果每一个元素出现在LevelN的链表中(N>1),那么这个元素必定在下层链表出现。
- 每一个节点都包含了两个指针,一个指向同一级链表中的下一个元素,一个指向下一层级别链表中的相同值元素。
跳表的插入
插入数据流程:
-
找到元素适合的插入层级K,这里的K采用随机的方式。若K大于跳表的总层级,那么开辟新的一层,否则在对应的层级插入。
-
申请新的节点。
-
调整对应的指针。
ConcurrentSkipListMap
ConcurrentSkipListMap 是 Java 中的一种线程安全、基于跳表实现的有序映射(Map)数据结构。它是对 TreeMap 的并发实现,支持高并发读写操作。
ConcurrentSkipListMap适用于需要高并发性能、支持有序性和区间查询的场景,能够有效地提高系统的性能和可扩展性。
常用API
// 创建一个 ConcurrentHashMap 对象
ConcurrentSkipListMap <Object, Object> concurrentSkipListMap = new ConcurrentSkipListMap <>();
// 添加键值对
concurrentSkipListMap.put("key", "value");
// 添加一批键值对
concurrentSkipListMap.putAll(new HashMap());
// 使用指定的键获取值
concurrentSkipListMap.get("key");
// 判定是否为空
concurrentSkipListMap.isEmpty();
// 获取已经添加的键值对个数
concurrentSkipListMap.size();
// 获取已经添加的所有键的集合
concurrentSkipListMap.keys();
// 获取已经添加的所有值的集合
concurrentSkipListMap.values();
// 清空
concurrentSkipListMap.clear();