TreeMap的构造函数
 
可以传入 自定义的比较器、Map、SortedMap。
 
put方法:
public V put(K key, V value) {
Entry<K,V> t = root; //得到根节点
if (t == null) { //如果根节点为空
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null); //把当前的键值对插入作为根节点
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator; //取得比较器
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key); //根据比较器 比较当前节点与插入节点的key
if (cmp < 0) //如果当前节点较小
t = t.left;
else if (cmp > 0) //如果当前节点较大
t = t.right;
else //如果相同
return t.setValue(value);
} while (t != null);
}
else { //如果没有传入一个比较器
if (key == null)
throw new NullPointerException();
@SuppressWarnings("unchecked")
Comparable<? super K> k = (Comparable<? super K>) key; //尝试将key转为Comparable<? super K>类型,就是说 如果没有传入比较器
//,key所在的类需要实现Comparable接口
do {
parent = t;
cmp = k.compareTo(t.key); //尝试用key自己实现的comparteTo方法比较父节点的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); //创建新节点,设置key value 父节点
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e); //插入新节点后 对 红黑树继续宁
size++;
modCount++;
return null;
}
public V put(K key, V value) {
Entry<K,V> t = root; //得到根节点
if (t == null) { //如果根节点为空
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null); //把当前的键值对插入作为根节点
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator; //取得比较器
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key); //根据比较器 比较当前节点与插入节点的key
if (cmp < 0) //如果当前节点较小
t = t.left;
else if (cmp > 0) //如果当前节点较大
t = t.right;
else //如果相同
return t.setValue(value);
} while (t != null);
}
else { //如果没有传入一个比较器
if (key == null)
throw new NullPointerException();
@SuppressWarnings("unchecked")
//尝试将key转为Comparable ,如果没有实现此接口,会报错
Comparable<? super K> k = (Comparable<? super K>) key;
do {
parent = t;
cmp = k.compareTo(t.key);//尝试用key自身的compareTo方法比较
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;

TreeMap 的简单解释的更多相关文章

  1. 如何简单解释 MapReduce算法

    原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...

  2. static_cast 、const_cast、dynamic_cast、reinterpret_cast 关键字简单解释

    static_cast .const_cast.dynamic_cast.reinterpret_cast 关键字简单解释: Static_cast 静态类型转换 ①用于类层次结构中基类(父类)和派生 ...

  3. 单个body|简单解释|复杂解释|反面解释

    单个body有三种方法简单解释.复杂解释和反面解释 ========================================================================== ...

  4. TreeMap,HashMap,LinkedHashMap区别,很简单解释

    TreeMap,HashMap,LinkedHashMap之间的区别和TreeSet,HashSet,LinkedHashSet之间的区别相似. TreeMap:内部排序. HashMap:无序. L ...

  5. 麦克斯韦方程组 (Maxwell's equation)的简单解释

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2016/12/12 以下会用高中的物理知识和大学微积分的数学知识对麦克斯韦方程组进行一个简单的解释.希望大家都能看得懂 ...

  6. ssh架构简单解释和vo po解释

      Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forwa ...

  7. GMM简单解释

    1.GMM(guassian mixture model) 混合高斯模型,顾名思义,就是用多个带有权重的高斯密度函数来描述数据的分布情况.理论上来说,高斯分量越多,极值点越多,混合高斯密度函数可以逼近 ...

  8. TCP/IP模型的简单解释

    TCP/IP模型是互联网的基础.想要理解互联网,就必须理解这个模型.但是,它不好懂,我就从来没有搞懂过. 前几天,BetterExplained上有一篇文章,很通俗地解释了这个模型.我读后有一种恍然大 ...

  9. 关于TCP的握手与挥手-----简单解释

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行conn ...

随机推荐

  1. MySQL ALTER TABLE语法

    先看一下定义(密密麻麻) ALTER TABLE tbl_name [alter_specification [, alter_specification] ...] [partition_optio ...

  2. JFR 使用记录

    进程的内存信息,可以使用jmap 和 jstack 等dump出文件,使用jhat 分析 dump 文件.不过比较简陋. 可以不停进程的方式有 JFR 或者taobao 开源组件. 本篇只记录JFR相 ...

  3. C/C++ 每日一题

    超长正整数的相加,题目链接:https://www.nowcoder.com/practice/5821836e0ec140c1aa29510fd05f45fc?tpId #include<al ...

  4. golang在linux下的安装操作

  5. win10 bcdedit testsigning

    win10 bcdedit testsigning # 禁用系统完整性检查和禁用驱动签名以及进入测试签名驱动模式> bcdedit.exe /set nointegritychecks on & ...

  6. map小列

    // 有关学生信息的头文件student.h代码如下 #include #include using namespace std; struct Student                    ...

  7. Node.js 实现 MySQL 数据库增删改查

    安装mysql $ npm isntall mysql 连接数据库 需要根据实际配置修改数据库用户名.及密码及数据库名 let mysql = require('mysql'); let connec ...

  8. linux apache的httpd

    学习目标:apache在linux上的应用,通过三种方式在浏览器上访问 LAMP:linux+apache+MYSQL+php wamp:windows+apache+MYSQL+php linux上 ...

  9. python(练习题)

    1.请写出冒泡排序将list1进行排序? List1 = [1,2,34,12,33,25,12,33,90,28] 2.使用python语言打印出name=”I love python”的长度 3. ...

  10. JSP内置对象(下)

    session的生命周期 创建 活动 销毁 application对象 Page对象