TreeMap&TreeSet解析

TreeMap

TreeSet使用适配器模式包装了TreeMap,所以只需要理解TreeMap就够了

概述

TreeMap实现了SortedMap接口,也就是说会按照顺序对Map中的元素进行排序,可以是自然顺序,也可以使用自定义比较器

TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(3, "Apple");
treeMap.put(1, "Banana");
treeMap.put(4, "Cherry");
treeMap.put(2, "Date");
//打印顺序
1 => Banana
2 => Date
3 => Apple
4 => Cherry
TreeMap<Integer, String> treeMap = new TreeMap<>((o1, o2) -> o2.compareTo(o1));
treeMap.put(3, "Apple");
treeMap.put(1, "Banana");
treeMap.put(4, "Cherry");
treeMap.put(2, "Date");
//打印顺序
4 => Cherry
3 => Apple
2 => Date
1 => Banana

底层原理

TreeMap底层通过红黑树(Red-Black tree)实现,也就意味着containsKey()get()put()remove()都有着log(n)的时间复杂度。

红黑树是一种近似平衡的二叉查找树,左子树的所有节点比根节点小,右子树的所有节点比根节点大

红黑树只能做到近似平衡,确保左右子树的高度差不会超过二者中较低那个的一倍,结构改变时需要调整树

调整过程中包括两个基本操作:

左旋和右旋

由于红黑树是一棵增强版的二叉查找树,红黑树的删除操作跟普通二叉查找树的删除操作也就非常相似,唯一的区别是红黑树在节点删除之后可能需要进行调整

快速失败

TreeMap是一个快速失败的集合,使用modCount记录结构性修改tag

posted @   枫叶藏在眼眸  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-08-24 【Java数据结构】循环队列的数组实现
2020-08-24 【Java数据结构】普通矩阵与稀疏矩阵的互相转化,稀疏矩阵的物理存储
点击右上角即可分享
微信分享提示