HashMap&TreeNode

这篇博客主要介绍了HashMap中的TreeNode,它是红黑树数据结构的基础单元。TreeNode作为Map中存储数据的节点,继承自HashMap的内部类。文章详细讲解了TreeNode的概念、特性,并重点分析了TreeNode的putTreeVal、balanceInsertion、rotateRight等关键方法,这些方法确保了红黑树在插入操作后的平衡性与高效性。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值