TreeMap put 操作分析
public V put(K key, V value) {
//t 表示当前节点,记住这个很重要!先把TreeMap 的根节点root 的引用赋值给当前节点
TreeMap.Entry<K,V> t = root;
//如果当前节点为null ,即是空树,新增的KV 形成的节点就是根节点
if (t == null) {
//看似多此一举,实际上预检了Key 是否 可以比较
compare(key, key); // type (and possibly null) check
// 使用Kv 构造出新的Entry 对象,其中第三个参数就是parent ,根节点没有父亲节点
root = new TreeMap.Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
// cmp 用来接收比较结果
int cmp;
TreeMap.Entry<K,V> parent;
// split comparator and comparable paths
//构造方法中置入的外部比较器
Comparator<? super K> cpr = comparator;
// 重点步骤:根据二叉树的特性,找到新的节点插入的合适位置
if (cpr != null) {
//循环的目标:根据key 与当前节点key 不断地进行对比
do {
//当前节点赋值个父亲节点,故从根节点开始遍历比较
parent = t;
//比较输入的参数的key和当前节点Key 的大小
cmp = cpr.compare(key, t.key);
//参数的key 更小,向左边走,把当前节点引用移动至它的左子节点上
if (cmp < 0)
t = t.left;
//参数的key 更大,向右边走,把当前节点引用移动至它的右子节点上
else if (cmp > 0)
t = t.right;
//如果相等,则会残忍的覆盖当前节点的Value 值,并返回更新的前的值
else
return t.setValue(value);
} while (t != null);
}
//在没有比较器的情况下,调用自然排序的Comparable 比较
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 对象,并把parent 置入参数
TreeMap.Entry<K,V> e = new TreeMap.Entry<>(key, value, parent);
//新节点找到自己的位置,原本以为可以安顿下来----------
if (cmp < 0)
//如果比较结果小于0 ,则成为parent 的左孩子
parent.left = e;
else
//如果比较结果大于0 ,则成为parent 的右孩子
parent.right = e;
//还需要重新对这个节点进行着色,旋转操作,已达到平衡
fixAfterInsertion(e);
size++;
modCount++;
//成功插入新节点后,返回null
return null;
}
TreeMap put 操作分析的更多相关文章
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- 计算机程序的思维逻辑 (43) - 剖析TreeMap
40节介绍了HashMap,我们提到,HashMap有一个重要局限,键值对之间没有特定的顺序,我们还提到,Map接口有另一个重要的实现类TreeMap,在TreeMap中,键值对之间按键有序,Tree ...
- Collections+Iterator 接口 | Map+HashMap+HashTable+TreeMap |
Collections+Iterator 接口 1. Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询 ...
- 【集合框架】JDK1.8源码分析之TreeMap(五)
一.前言 当我们需要把插入的元素进行排序的时候,就是时候考虑TreeMap了,从名字上来看,TreeMap肯定是和树是脱不了干系的,它是一个排序了的Map,下面我们来着重分析其源码,理解其底层如何实现 ...
- 容器--TreeMap
一.概述 在Map的实现中,除了我们最常见的KEY值无序的HashMap之外,还有KEY有序的Map,比较常用的有两类,一类是按KEY值的大小有序的Map,这方面的代表是TreeMap,另外一种就保持 ...
- Java之TreeMap
基本特性: 基于红黑树. 非线程安全. 同步使用: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...))
- Map接口,Map.Entry,hashMap类,TreeMap类,WeakHashMap。
Collection接口之前接触过,每次保存的对象是一个对象,但是在map中保存的是一对对象,是以key->value形式保存的. 定义: public interface Map<K,V ...
- Java 集合类 TreeSet、TreeMap
TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之 ...
- 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...
随机推荐
- 第5章 首次登录与在线求助man page
首次登录系统 centos默认图像界面为GNOME. Linux默认情况下会提供6个Terminal来让用户登录,切换方式为ctrl+alt+[F1-F6],系统将这六个操作界面命名为tty1-tty ...
- vsftpd 安全性能工具
vsftpd实战(服务端192.168.23.12,客户端192.168.23.11) 1:安装vsftpdyum install -y vsftpd 2:客户端安装lftpyum install - ...
- 利用canvas对上传图片进行上传前压缩
利用谷歌调式工具发现,图片大小直接影响着首屏加载时间. 且考虑到后期服务端压力,图片压缩特别必要. 本文是前端利用canvas实现图片.参考文章:https://www.cnblogs.com/007 ...
- Web服务器负载均衡的几种方案 : DNS轮询
本篇主要讲一下最简单的方案——DNS轮询. DNS轮询 大多域名注册商都支持多条A记录 的解析,其实这就是DNS轮询 ,DNS 服务器 将解析请求按照A记录 的顺序,逐一分配到不同的IP上,这样就完成 ...
- @Resource 注解的作用【和 @Autowired 的对比】
今天看到一段代码使用的是 @Resource 的注解,的确是第一次看到这个注解,百度一查才知道,原来和 @Autowired 效果一样,但也有一定的区别. 两个注解都可以用来注入 bean ,@Res ...
- js & right click menu & 鼠标滑词
js & right click menu & 鼠标滑词 // 鼠标滑词 mouseSlipGetWords() { const getSelectionText = () => ...
- CPU测试--查看cpu占用率
一.使用命令adb shell top -m 10 -s cpu(-t 显示进程名称,-s 按指定行排序,-n 在退出前刷新几次,-d 刷新间隔,-m 显示最大数量),如下图: 参数含义: PID:p ...
- 第102天:CSS3实现立方体旋转
CSS3实现立方体旋转 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包
题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...
- Java试题二
QUESTION 37Given:1. class Super {2. private int a;3. protected Super(int a) { this.a = a; }4. } ...1 ...