TreeNode
概念
即Map中红黑树结构存储数据的单位;其中包含的方法很多,不一一列举;看下面的代码可知道,TreeNode继承自LinkedHashMap内部类Entry<K,V>,而Entry<K,V>又继承自HashMap.Node<K,V>,具体的字段介绍请看下面注释
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
TreeNode<K,V> parent; // red-black tree links 父节点
TreeNode<K,V> left; //左子树
TreeNode<K,V> right; //右子树
TreeNode<K,V> prev; // 删除后需要取消链接 needed to unlink next upon deletion
boolean red; //颜色属性
TreeNode(int hash, K key, V val, Node<K,V> next) {
super(hash, key, val, next);
}
特性
- 每个节点要么是黑色,要么是红色。(节点非黑即红)
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。
- 如果一个节点是红色的,则它的子节点必须是黑色的。(也就是说父子节点不能同时为红色)
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(这一点是平衡的关键)
TreeNode方法分析
putTreeVal(HashMap<K,V> map, Node<K,V>[] tab,int h, K k, V v):红黑树添加节点
/**
* Tree version of putVal.
* HashMap:此hashmap对象
* Node[]:内部Node数组
* int h:key的hash码
* K:要存储的Key
* V:要存储的Value
*/
final TreeNode<K,V> putTreeVal(HashMap<K,V> map, Node<K,V>[] tab,
int h, K k, V v) {
Class<?> kc = null;//定义K 的类信息
boolean searched = false;
//获取红黑树的根节点
TreeNode<K,V> root = (parent != null) ? root() : this;
for (TreeNode<K,V> p = root;;) {
int dir, ph; K pk;
if ((ph = p.hash) > h)//比较根节点的hash和要存入的key的hash
dir = -1;//要添加的元素应该放置在当前节点的左侧
else if (ph < h)
dir = 1;//要添加的元素应该放置在当前节点的右侧
else if ((pk = p.key) == k || (k != null && k.equals(pk)))//如果要存入的key和根节点完全相同,直接返回
return p;
// 走到这一步说明 当前节点的hash值 和 指定key的hash值 是相等的,但是equals不等
else if ((kc == null &&
(kc = comparableClassFor(k)) == null) || //查看k是否实现了comparable
(dir = compareComparables(kc, k, pk)) == 0) {
// 走到这里说明:指定key没有实现comparable接口或者实现了comparable接口并且和当前节点的键对象比较之后相等
if (!searched) {
TreeNode<K,V> q, ch;
searched = tr