首页 > 其他分享 >TreeMap底层

TreeMap底层

时间:2022-11-14 14:14:51浏览次数:41  
标签:parent TreeMap value 底层 key Entry null cmp

public class TreeMap<K,V>{
    //    重要属性
    //外部比较器
    private final Comparator<? super K> comparator;
    //树的根节点
    private transient Entry<K,V> root;
    private transient int size = 0;
    //空构造器
    public TreeMap() {
        comparator = null;//如果使用空构造器,那么底层就不适用外部比较器
    }
    //有参构造器
    public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;//如果使用有参构造器,那么就相当于指定了外部比较器
    }
    public V put(K key, V value) {//K和V的类型在创建对象的时候就已经确定
    //如果放入的是第一对元素,那么t的值为NULL
    
        Entry<K,V> t = root;//再放入第二个节点的时候,root已经是跟节点了
        //如果放入的是第一个元素的话,走入这个if中
        if (t == null) {
            //自己跟自己比
            compare(key, key); // type (and possibly null) check
            //根节点确定为root
            root = new Entry<>(key, value, null);
            //size=1
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        //将外部比较器赋给cpr
        Comparator<? super K> cpr = comparator;
        //cpr不等于null,意味着你刚才创建对象的时候调用了有参构造器,指定了外部比较器
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);//将元素的KEY值作比较
                //cmp返回的值就是int类型的数据:
                //要是这个值<0   =0  >0
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else//cmp==0
                //如果Key的值一样,那么新的value替换老的value,但是key不变因为key是唯一的
                    return t.setValue(value);
            } while (t != null);
        }
        //cpr等于null,意味着你刚才创建对象的时候调用了空参构造器,没有指定外部比较器,使用内部比较器
        else {
            if (key == null)
                throw new NullPointerException();
            @SuppressWarnings("unchecked")
                Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }
}

static final class Entry<K,V> implements Map.Entry<K,V> {
        K key;
        V value;
        Entry<K,V> left;
        Entry<K,V> right;
        Entry<K,V> parent;
        boolean color = BLACK;
        

 

标签:parent,TreeMap,value,底层,key,Entry,null,cmp
From: https://www.cnblogs.com/jeldp/p/16888859.html

相关文章

  • HashMap1.7底层
    //1.HashMap的K,V的值,在创建对象的时候确定:K:IntegerV:String//HashMap的父类AbstractMap已经实现类Map接口,但是源码中又单独实现了Map接口//这个操作就是一个多余的操作......
  • HashMap底层
    publicclassHashSet<E>{//重要属性privatetransientHashMap<E,Object>map;privatestaticfinalObjectPRESENT=newObject();//构造器......
  • C++之string的底层简单实现!(七千字长文详解)
    C++之string的底层简单实现!string之私有成员变量namespaceMySTL{classstring {private: char*_str; size_t_size; size_t_capacity; //这里capa......
  • spring底层核心概念解析
    1.BeanDefinition包含bean的一些基本元信息,如bean的类型,作用域,初始化方法...等等。申明式的定义,如@Bean,等等<beanclass="com.test.service.UserService"id="userSe......
  • 硬核剖析Java锁底层AQS源码,深入理解底层架构设计
    我们常见的并发锁ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁。上篇文章讲了AQS的加锁流程,这......
  • 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC
    RPC(RemoteProcedureCall)是Hadoop服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-ProcessCommunication,IPC)通信逻辑,是分布式系统的基础。允许运行于一台计......
  • 想会用synchronized锁,先掌握底层核心原理
    摘要:synchronized锁修饰方法和代码块时底层实现上是一样的,但是在修饰方法时,不需要JVM编译出的字节码完成加锁操作,而synchronized在修饰代码块时,是通过编译出来的字节码生成......
  • Vue路由实现的底层原理
    在Vue中利用数据劫持defineProperty在原型prototype上初始化了一些getter,分别是router代表当前Router的实例、router代表当前Router的实例、router代表当前Router的实例......
  • 从 unlink/rm 底层实现来看Linux文件系统管理
    文章目录​​1.前言​​​​2.文件系统结构​​​​3.Unlink实现​​文中涉及到的内核源代码版本是3.10.1。1.前言工作中听到一个同事对unlink系统调用的描述,unlink并......
  • 原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么
    开心一刻女孩睡醒玩手机,收到男孩发来一条信息:我要去跟我喜欢的人表白了!女孩的心猛的一痛,回了条信息:去吧,祝你好运!男孩回了句:但是我没有勇气说不来,怕被打!女孩......