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是基于散列表实现的,时间 ...
随机推荐
- 高性能的HTTP代理 LittleProxy
引用: https://github.com/adamfisk/LittleProxy 拦截和操纵HTTPS流量,LittleProxy使用中间人(MITM)管理器. LittleProxy的默认实现 ...
- log4j配置独立日志方法
不使用类,而是使用loggerName来创建日志: #json是用java代码创建logger时用name,而不是jsonlog,注意,不需要在rootLogger中再配置,否则其它无关信息也将输出到 ...
- ie浏览器升级的正确姿势
一.版本说明 1.当前IE浏览器分为一下几个版本:IE 6,IE 7,IE 8,IE 9,IE 10,IE 11 2.windows最高支持IE版本win xp:IE 8win 7 :IE 11win ...
- MySQL一主两从
服务器说明: MySQL-Master:192.168.1. MySQL-Slave1:192.168.1. MySQL-Slave2:192.168.1. 关闭防火墙,关闭selinux 统一采用源 ...
- 行列式(二):余子式&代数余子式
目录 按行列展开 \(\Delta\)以下内容主要为<线性代数>的学习笔记 按行列展开 一般来说,低阶行列式的计算比高阶行列式的计算要简单得多,因此考虑用低阶行列式来表示高阶行列式.为此, ...
- [ZJOI2014]力 FFT
题面 题解: \[F_j = \sum_{i < j}\frac{q_iq_j}{(i - j)^2} - \sum_{i > j}{\frac{q_iq_j}{(i - j)^2}}\] ...
- 不使用java内置函数,将String字符串转换为int类型
package com.test; public class AtoiTest { public static void main(String[] args) throws Exception { ...
- 【CF528D】Fuzzy Search(FFT)
[CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...
- C++ 指针[转+原创]
要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区. 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉 ...
- linux swap交换分区配置
参考 http://commandos.blog.51cto.com/154976/115288/