TreeMap内部实现简介
1、概述
TreeMap是Java内部实现比较复杂的集合类之一。与HashMap不一样,TreeMap的底层不是用哈希表实现的,而是用红黑树实现的。另外,HashMap存取元素的时间复杂度是O(1)的常量级,而TreeMap对元素的操作复杂度为O(log n)。虽然在操作性能方面,TreeMap不占优势,但是因为它使用红黑树(平衡二叉查找树)实现,所以它内部的元素都是排好序的。当需要查找的元素是排好序的,TreeMap的优势就体现出来了。
2、红黑树简介
首先,介绍一下红黑树的基本性质。红黑树不是一棵严格意义上的平衡树,因为它的高度差会大于1。了解一下它的性质就清楚了。
红黑树是一棵二叉树,它满足以下5个特性:
<1>每个节点的颜色是红色或黑色。
<2>根节点必须是黑色的。
<3>每个叶节点是黑色的(叶节点是指树尾端的NULL节点)。
<4>如果一个节点是红色的,那么它的子节点必须是黑色。即,不能有连续的红色节点。
<5>对于任意一个节点,从它到叶节点的每条路径包含相同数量的黑色节点。
由上述定义可知,红黑树是一棵相对平衡的二叉查找树。因为红黑树天生需要平衡,所以就可以避免一般的二叉查找树在极端情况(插入的数据已经排好序)失去平衡的情况。
3、TreeMap的Entry类
由于TreeMap包含了tree和Map的性质,它所包含的的Entry类应该有以下6个成员变量:
左子结点引用、右子节点引用、父节点引用、key、value、color。
在JDK中,Entry的具体定义如下:
static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> left = null; Entry<K,V> right = null; Entry<K,V> parent; boolean color = BLACK; /** * Make a new cell with given key, value, and parent, and with * {@code null} child links, and BLACK color. */ Entry(K key, V value, Entry<K,V> parent) { this.key = key; this.value = value; this.parent = parent; }
}
4、TreeMap的put(key ,value)操作
插入元素由put操作进行,主要包括两个过程,第一步是通过计算key找到插入元素的位置,如果新加入的key不存在直接插入;如果存在,那么就更新原节点的值。第二步是,因为插入新元素可能会破坏红黑树的属性,如果被破坏了,就要通过左右旋转等操作恢复红黑树的属性。具体代码如下:
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); 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(); 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<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.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置. echo [{on│off}] [message] ...
- [Linux Audio Driver] 高通平台内部MIC_BIAS简介
#更新 2020.05.10 我觉得我这个标题取的不是很妥当,为了表达对技术的敬畏之心,我将原标题 <一文搞懂内部MIC_BIAS>修改为<高通平台内部MIC_BIAS简介> ...
- InfoVista.NET 内部数据格式简介
一个例子: <?xml version="1.0" encoding="GB2312"?> <Folder name="root&q ...
- TreeMap、TreeSet简介
TreeMap TreeMap底层采用红黑树保存每个Entry对象,红黑树是一种自平衡排序二叉树. TreeMap添加元素源码: public V put(K key, V value) {// 获取 ...
- java集合类深入分析之TreeMap/TreeSet篇
2019独角兽企业重金招聘Python工程师标准>>> 简介 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构.和普通的HashMap不一样,普通的HashM ...
- java Collection-Map 之 TreeMap
为什么80%的码农都做不了架构师?>>> TreeMap 内部定义了一个类 static final class Entry<K,V> implements Ma ...
- 计算机程序的思维逻辑 (43) - 剖析TreeMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>(马俊昌著),由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买:京东自营链接 ...
- JDK源码分析-TreeMap(1)
概述 前面数据结构与算法笔记对红黑树进行了分析,而 TreeMap 内部就是基于红黑树实现的.示意图: 转载于:https://juejin.im/post/5d05a9bd6fb9a07ecb0ba ...
- 深入理解HashMap和TreeMap的区别
文章目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非 ...
- Java编程的逻辑 (43) - 剖析TreeMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
最新文章
- android+布局分块,android的List View的Item布局问题
- golang defer的使用
- 会话管理-2.1.Session介绍
- Postman:Postman简介、安装、入门使用方法详细攻略
- LayaBox IDE 安装后执行项目报错解决方案的一些记录
- 初中文化能学编程吗_网页编程课程来了,确定不来pick一下!!!|科创辅学进行时...
- outlook 2007 自动答复邮件
- DWR操作java对象
- 计算机组成原理—基本概念(不基础的部分)
- 库存转换是什么意思_安全库存的设置:库存计划的看家本领
- CSDN博客里的大学生活简历——共勉
- Vi编辑异常退出解决
- Hive Distribute by 应用之动态分区小文件过多问题优化
- linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
- Vue双向绑定失效 v-model
- html首行缩进2字符,可以使用CSS属性中的【text-indent】进行设置。
- 一文了解 | 革兰氏阳性和阴性菌区别,致病差异,针对用药
- Effective C++ 条款20_宁以 pass-by-reference-to-const 替换 pass-by-value_不止于此
- 大学四年,这些让我起飞的计算机必看书籍
- 仿QQ空间文章列表+评论查询