TreeMap
继承自AbstractMap
,并实现了 NavigableMap
接口。NavigableMap 接口继承了SortedMap
接口,SortedMap 最终继承自Map
接口,同时 AbstractMap 类也实现了 Map 接口。以上就是 TreeMap 的继承体系,描述起来有点乱,不如看图了:
上图就是 TreeMap 的继承体系图,比较直观。这里来简单说一下继承体系中不常见的接口NavigableMap
和SortedMap
,这两个接口见名知意。先说 NavigableMap 接口,NavigableMap 接口声明了一些列具有导航功能的方法,比如:
/**
- 返回红黑树中最小键所对应的 Ent
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
ry
*/
Map.Entry<K,V> firstEntry();
/**
- 返回最大的键 maxKey,且 maxKey 仅小于参数 key
*/
K lowerKey(K key);
/**
- 返回最小的键 minKey,且 minKey 仅大于参数 key
*/
K higherKey(K key);
// 其他略
通过这些导航方法,我们可以快速定位到目标的 key 或 Entry。至于 SortedMap 接口,这个接口提供了一些基于有序键的操作,比如
/**
- 返回包含键值在 [minKey, toKey) 范围内的 Map
*/
SortedMap<K,V> headMap(K toKey)😭);
/**
- 返回包含键值在 [fromKey, toKey) 范围内的 Map
*/
SortedMap<K,V> subMap(K fromKey, K toKey);
// 其他略
以上就是两个接口的介绍,很简单。至于 AbstractMap 和 Map 这里就不说了,大家有兴趣自己去看看 Javadoc 吧。关于 TreeMap 的继承体系就这里就说到这,接下来我们进入细节部分分析。
JDK 1.8
中的TreeMap
源码有两千多行,还是比较多的。本文并不打算逐句分析所有的源码,而是挑选几个常用的方法进行分析。这些方法实现的功能分别是查找、遍历、插入、删除等,其他的方法小伙伴们有兴趣可以自己分析。TreeMap
实现的核心部分是关于红黑树
的实现,其绝大部分的方法基本都是对底层红黑树增、删、查操作的一个封装。如简介所说,只要弄懂了红黑树原理,TreeMap 就没什么秘密了。关于红黑树
的原理,红黑树详细分析,本篇文章不会对此展开讨论。</