TreeMap 的简单解释


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 的简单解释的更多相关文章
- 如何简单解释 MapReduce算法
原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...
- static_cast 、const_cast、dynamic_cast、reinterpret_cast 关键字简单解释
static_cast .const_cast.dynamic_cast.reinterpret_cast 关键字简单解释: Static_cast 静态类型转换 ①用于类层次结构中基类(父类)和派生 ...
- 单个body|简单解释|复杂解释|反面解释
单个body有三种方法简单解释.复杂解释和反面解释 ========================================================================== ...
- TreeMap,HashMap,LinkedHashMap区别,很简单解释
TreeMap,HashMap,LinkedHashMap之间的区别和TreeSet,HashSet,LinkedHashSet之间的区别相似. TreeMap:内部排序. HashMap:无序. L ...
- 麦克斯韦方程组 (Maxwell's equation)的简单解释
[转载请注明出处]http://www.cnblogs.com/mashiqi 2016/12/12 以下会用高中的物理知识和大学微积分的数学知识对麦克斯韦方程组进行一个简单的解释.希望大家都能看得懂 ...
- ssh架构简单解释和vo po解释
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forwa ...
- GMM简单解释
1.GMM(guassian mixture model) 混合高斯模型,顾名思义,就是用多个带有权重的高斯密度函数来描述数据的分布情况.理论上来说,高斯分量越多,极值点越多,混合高斯密度函数可以逼近 ...
- TCP/IP模型的简单解释
TCP/IP模型是互联网的基础.想要理解互联网,就必须理解这个模型.但是,它不好懂,我就从来没有搞懂过. 前几天,BetterExplained上有一篇文章,很通俗地解释了这个模型.我读后有一种恍然大 ...
- 关于TCP的握手与挥手-----简单解释
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行conn ...
随机推荐
- updatetable 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条造成问题一种原因
数据库 表A ID UserName DeptID DeptName 1 张三 1 技术部 表B ID DeptName 1 市场部 当使 ...
- 我瞅瞅源码系列之---flask
快速使用 通过werkzurg 了解wsgi threading.local和高级 LocalStack和Local对象实现栈的管理 Flask源码之:配置加载 Flask源码之:路由加载 ...
- Deleaker – 内存泄漏猎人(RAD Studio 的附加组件)
程序员面临(并希望我们意识到)的常见问题之一是内存泄漏或任何其他类型的资源泄漏.例如,Windows限制了进程一次可以分配的GDI或USER32对象的数量.当事情走错路时,您可能希望拥有一些工具来帮助 ...
- 1. Spark Streaming概述
1.1 什么是Spark Streaming Spark Streaming类似于Apache Storm,用于流式数据的处理.根据其官方文档介绍,Spark Streaming有高吞吐量和容错能力强 ...
- (十二)一个简单的pdf文件体
%PDF-1.0 % 文件头,说明符合PDF1.0规范 1 0 obj %对象号 产生号(修改次数) ...
- SVN客户端教程
.SVN是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历史,Subversion可以通过网络访问 ...
- nmon2influxdb+grafana:服务监控可视化部署
在工作中,无论是定位线上问题,还是性能优化,都需要对前端.后台服务进行监控.而及时的获取监控数据,能更好的帮助技术人员排查定位问题. 前面的博客介绍过服务端监控工具:Nmon使用方法及利用easyNm ...
- Mysql表字段命令alter add
alter add命令用来增加表的字段. alter add命令格式:alter table 表名 add字段 类型 其他; 例如,在表MyClass中添加了一个字段passtest,类型为int(4 ...
- Resharper2019 1.2破解教程
下载安装 Resharper 去Resharper官网下载安装 Resharper官网地址 Resharper下载地址 破解 (破解dll百度网盘链接)[https://pan.baidu.com/s ...
- 接口的鉴权cookie、session和token
1.HTTP是无状态协议 什么是无状态?就是说这一次的请求和上一次的请求是没有任何关系的,无法共享信息.好处就是速度快. 2.cookie.session的加入 HTTP请求是无状态的,所以解决共享信 ...