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高级 之 order by、group by 优化

    参考:  https://blog.csdn.net/wuseyukui/article/details/72627667 order by示例 示例数据: Case 1 Case 2 Case 3 ...

  2. 4. Spark Streaming解析

    4.1 初始化StreamingContext import org.apache.spark._ import org.apache.spark.streaming._ val conf = new ...

  3. Spark实战电影点评系统(二)

    二.通过DataFrame实战电影点评系统 DataFrameAPI是从Spark 1.3开始就有的,它是一种以RDD为基础的分布式无类型数据集,它的出现大幅度降低了普通Spark用户的学习门槛. D ...

  4. vue css module

    步骤 module <style> -> <style module> class='header' -> :class='$style.header' <t ...

  5. 【题解】Luogu P5337 [TJOI2019]甲苯先生的字符串

    原题传送门 我们设计一个\(26*26\)的矩阵\(A\)表示\(a~z\)和\(a~z\)是否能够相邻,这个矩阵珂以由\(s1\)得出.答案显然是矩阵\(A^{len_{s2}-1}\)的所有元素之 ...

  6. Drools 规则文件语法概述

    概述(Overview) 以.drl为扩展名的文件,是Drools中的规则文件,规则文件的编写,遵循Drools规则语法.下面详细介绍一下Drools规则文件语法.具体参考官方文档: https:// ...

  7. .NET Core随笔把数据库数据查出来转JSON并输出

    直接创建WEB项目即可: public class Startup { //startup.cs是站点启动时具体做了哪些事情,主要是开启了一个mvc服务. public Startup(IConfig ...

  8. ASP.NET Nlog上手练习小例子

    添加NuGet程序包-             Nlog             Nlog.Web.AspNetCore 两个包. public void Configure(IApplication ...

  9. MongoDB和Java(3):Java操作MongoB

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  10. x.append()增加不同维度的区别

    b=np.array([[7,2],[2,4],[3,6],[7,8],[9,10]])print(b)print(type(b)) # 结果显示为nunmpy 数组a=[]for i in rang ...