Java TreeMap 和 TreeSet 源码解析
A Red-Black tree based {@link NavigableMap} implementation.
The map is sorted according to the {@linkplain Comparable natural
ordering} of its keys, or by a {@link Comparator} provided at map
creation time, depending on which constructor is used.
TreeMap 是红黑二叉树。TreeSet 是红黑二叉树,不过他的元素是只有一个Key,而TreeMap key 用来排序,Value 是map 对应的值。
TreeMap 是基于红黑二叉树实现的,而HashMap 是基于数组加链表。
java.util.TreeMap#fixAfterInsertion
/** From CLR */private void fixAfterInsertion(TreeMapEntry<K,V> x) {x.color = RED;while (x != null && x != root && x.parent.color == RED) {if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {TreeMapEntry<K,V> y = rightOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);x = parentOf(parentOf(x));} else {if (x == rightOf(parentOf(x))) {x = parentOf(x);rotateLeft(x);}setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateRight(parentOf(parentOf(x)));}} else {TreeMapEntry<K,V> y = leftOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);x = parentOf(parentOf(x));} else {if (x == leftOf(parentOf(x))) {x = parentOf(x);rotateRight(x);}setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateLeft(parentOf(parentOf(x)));}}}root.color = BLACK;}
左旋、右旋、
java.util.TreeMap#fixAfterDeletion
/** From CLR */private void fixAfterDeletion(TreeMapEntry<K,V> x) {while (x != root && colorOf(x) == BLACK) {if (x == leftOf(parentOf(x))) {TreeMapEntry<K,V> sib = rightOf(parentOf(x));if (colorOf(sib) == RED) {setColor(sib, BLACK);setColor(parentOf(x), RED);rotateLeft(parentOf(x));sib = rightOf(parentOf(x));}if (colorOf(leftOf(sib)) == BLACK &&colorOf(rightOf(sib)) == BLACK) {setColor(sib, RED);x = parentOf(x);} else {if (colorOf(rightOf(sib)) == BLACK) {setColor(leftOf(sib), BLACK);setColor(sib, RED);rotateRight(sib);sib = rightOf(parentOf(x));}setColor(sib, colorOf(parentOf(x)));setColor(parentOf(x), BLACK);setColor(rightOf(sib), BLACK);rotateLeft(parentOf(x));x = root;}} else { // symmetricTreeMapEntry<K,V> sib = leftOf(parentOf(x));if (colorOf(sib) == RED) {setColor(sib, BLACK);setColor(parentOf(x), RED);rotateRight(parentOf(x));sib = leftOf(parentOf(x));}if (colorOf(rightOf(sib)) == BLACK &&colorOf(leftOf(sib)) == BLACK) {setColor(sib, RED);x = parentOf(x);} else {if (colorOf(leftOf(sib)) == BLACK) {setColor(rightOf(sib), BLACK);setColor(sib, RED);rotateLeft(sib);sib = leftOf(parentOf(x));}setColor(sib, colorOf(parentOf(x)));setColor(parentOf(x), BLACK);setColor(leftOf(sib), BLACK);rotateRight(parentOf(x));x = root;}}}setColor(x, BLACK);}
Java TreeMap 和 TreeSet 源码解析相关推荐
- 面试官系统精讲Java源码及大厂真题 - 11 HashSet、TreeSet 源码解析
11 HashSet.TreeSet 源码解析 更新时间:2019-09-16 19:37:35 成功的奥秘在于目标的坚定. --迪斯雷利 引导语 HashSet.TreeSet 两个类是在 Map ...
- TreeSet源码解析
TreeSet概述 所有实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, NavigableSet< ...
- java arraylist 赋值_ArrayList源码解析,老哥,来一起复习一哈?
点击上方"码农沉思录",选择"设为星标" 优质文章,及时送达 前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会 ...
- Java并发之Semaphore源码解析
Semaphore 前情提要 在学习本章前,需要先了解ReentrantLock源码解析,ReentrantLock源码解析里介绍的方法有很多是本章的铺垫.下面,我们进入本章正题Semaphore. ...
- Java集合部分学习+源码解析
Java集合 对象的容器,实现了对对象常用的操作,类似数组功能. 集合中的数据都是在内存中,当程序关闭或者重启后集合中的数据就会丢失,所以说是临时存储数据的容器 集合整体框架 Collection:单 ...
- Java FileReader InputStreamReader类源码解析
FileReader 前面介绍FileInputStream的时候提到过,它是从文件读取字节,如果要从文件读取字符的话可以使用FileReader.FileReader是可以便利读取字符文件的类,构造 ...
- 爆火的Java面试题-kafka源码解析与实战豆瓣
1 基础 为什么 Java 中只有值传递? int 范围?float 范围? hashCode 与 equals,什么关系? String StringBuffer 和 StringBuilder 的 ...
- 深入Java集合ArrayList的源码解析
现在由大恶人付有杰来从增删改查几个角度轻度解析ArrayList的源码 首先ArrayList的底层数据结构非常简单,就是一个数组. 从源码第115行我们可以得出信息,他的默认数组长度是10. /** ...
- Java集合---Arrays类源码解析
一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...
最新文章
- 代码攻击破坏设备,炸毁 27 吨发电机的背后
- FIS前端集成解决方案
- ARMV7,ARMV8
- php重载,PHP 重载
- 工业以太网交换机与网络交换机的区别
- 一步步编写操作系统80 扩展内联汇编1
- Javascript根据属性从对象数据中删除元素
- javascript释放对象_一文深入理解JavaScript如何运作
- paip.mysql 全文索引查询空白解决
- 软件测试和软件调试的区别
- 论文翻译:2021_TSCN:Decoupling magnitude and phase optimization with a two-stage deep network
- 靶子环数图片_一种靶子环数的图像识别方法与流程
- 2021Q2产品团队绩效总结--管理日记
- python做文本情感分析——某APP内评论内容作样本
- 如何获取小程序链接的配置参数
- SQL中PIVOT的用法
- Word中10以内的都是带圆圈的数字到了11就没有圆圈
- 验证运放输入端之间电容作用
- 【论文阅读】【逐字翻译】 爱丁堡大学IEEE TPAMI 2021年最新元学习综述 《Meta-Learning in Neural Networks: A Survey》
- 2013年最受欢迎的20大网页设计趋势
热门文章
- 时间同步软件 windows_电脑上好用的便利贴软件,PC端便签软件
- java web里实现 mvc_MVC模式在Java Web应用程序中的实现
- oracle 主机名改ip,[oracle 10.2]主机名或者IP地址改变造成的dbconsole服务无法启动解决...
- 骨架提取的MATLAB实现
- Kubernetes(1) kubectl 入门
- 发现了一个delphi的form的bug
- Eclipse-Java代码规范和质量检查插件-阿里编码规约
- 精确到秒的JQuery日期控件,jquery日历插件,jquery日期插件
- Erlang--热更新
- UIScrollView无法滚动可能的原因及解决办法分析