treemap使用了解
参考了https://www.jianshu.com/p/d9ad7f6d75a0
https://www.zhuxiaodong.net/2018/collection-in-java-treemap/
https://yanglukuan.github.io/2017/09/06/java/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E4%B9%8BTreeMap%E8%AF%A6%E8%A7%A3/
https://blog.csdn.net/yan_wenliang/article/details/51092633
心不够静,先了解treemap,心静脑子到位的时候再吃透原理
存储结构
分析一个数据类型最好的办法就是看它的内部存储结构,通过分析存储的数据结构,我们可以更清楚的看到它的实现原理和方法,从而更好的去使用,因为特定的数据结构只有用在特定的场景下,才会发挥它最大的作用。TreeMap
内部使用的数据结构为红黑树(Red-Black tree),关于红黑树,这里简单介绍一下,红黑树属于二叉排序树,但是在二叉排序树的基础上,又增加了一些规则,比如定义节点的着色等,这样就不会出现一些极端的情况,比如,整个树出现了偏离,变为了单分支结构的树,这样,整个树的高度就是n,n为全部的节点数。在这样的节点分部情况下,查找一个节点所需的时间复杂度为O(n)
,为了避免这样的情况,聪明的人类又发明了另一种树形结构,叫做平衡二叉树,平衡二叉树查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(logn)
。红黑树就是平衡二叉树的一种实现方式。红黑树定义了一些规则,保证树的高度维持在logn
。
1、每个结点要么是红的要么是黑的。
2、根结点是黑的。
3、每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
4、如果一个结点是红的,那么它的两个儿子都是黑的。
5、对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
规则
1、基于红黑树(Red-Black tree
)的数据结构实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator
进行排序,具体取决于使用的构造方法。
2、不允许插入为Null
的key
3、可以插入值为Null
的Value
4、若Key
重复,则后面插入的直接覆盖原来的Value
5、非线程安全
6、根据key
排序,key
必须实现Comparable
接口,可自定义比较器实现排序。
7、TreeMap
使用的数据结构决定了他的插入操作变的比较复杂,需要维护一个红黑树,所以TreeMap
不适合用在频繁修改的场景,如果不需要实现有序性,则建议使用HashMap
,存取效率要高一些。
类继承关系
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
- 1.Map 接口: 定义将键值映射到值的对象,Map规定不能包含重复的键值,每个键最多可以映射一个值,这个接口是用来替换Dictionary类。
- 2.AbstractMap 类: 提供了一个Map骨架的实现,尽量减少了实现Map接口所需要的工作量
- 3.SortedMap 接口: 定义按照key排序的Map结构,规定key-value是根据键key值的自然排序进行排序的,或者根据构造key-value时设定的构造器进行排序。
- 4.NavigableMap 接口: 是SortedMap接口的子接口,在其基础上扩展了针对搜索目标返回最近匹配项的导航方法,例如方法lowEntry、floorEntry、ceilingEntry等,如果不存在这样的键,则返回null
- 5.Cloneable 接口: 实现了该接口的类可以显示的调用Object.clone()方法,合法的对该类实例进行字段复制,如果没有实现Cloneable接口的实例上调用Obejct.clone()方法,会抛出CloneNotSupportException异常。正常情况下,实现了Cloneable接口的类会以公共方法重写Object.clone()
- 6.Serializable 接口: 实现了该接口标示了类可以被序列化和反序列化,具体的 查询序列化详解
SortedMap接口
既然如此,我们就先说一下SortedMap接口
public interface SortedMap<K,V> extends Map<K,V> {
Comparator<? super K> comparator(); //用来返回这个map用的比较器,或者null
SortedMap<K,V> subMap(K fromKey, K toKey); //返回部分map满足key大于等于fromKey,小于toKey
SortedMap<K,V> headMap(K toKey); //返回部分map满足key小于toKey
SortedMap<K,V> tailMap(K fromKey); //返回部分map满足key大于等于fromKey
K firstKey(); //返回第一个key(最小的key)
K lastKey(); //返回最后一个key(最大的key)
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
}
TreeMap接口
Entry<K, V> ceilingEntry(K key) //返回键不小于key的最小键值对entry
K ceilingKey(K key) //返回键不小于key的最小键
void clear() //清空TreeMap
Object clone() //克隆TreeMap
Comparator<? super K> comparator() //比较器
boolean containsKey(Object key) //是否包含键为key的键值对
NavigableSet<K> descendingKeySet() //获取降序排列key的Set集合
NavigableMap<K, V> descendingMap() //获取降序排列的Map
Set<Entry<K, V>> entrySet() //获取键值对entry的Set集合
Entry<K, V> firstEntry() //第一个entry
K firstKey() //第一个key
Entry<K, V> floorEntry(K key) //获取不大于key的最大键值对
K floorKey(K key) //获取不大于key的最大Key
V get(Object key) //获取键为key的值value
NavigableMap<K, V> headMap(K to, boolean inclusive) //获取从第一个节点开始到to的子Map, inclusive表示是否包含to节点
SortedMap<K, V> headMap(K toExclusive) //获取从第一个节点开始到to的子Map, 不包括toExclusive
Entry<K, V> higherEntry(K key) //获取键大于key的最小键值对
K higherKey(K key) //获取键大于key的最小键
boolean isEmpty() //判空
Set<K> keySet() //获取key的Set集合
Entry<K, V> lastEntry() //最后一个键值对
K lastKey() //最后一个键
Entry<K, V> lowerEntry(K key) //键小于key的最大键值对
K lowerKey(K key) //键小于key的最大键值对
NavigableSet<K> navigableKeySet() //返回key的Set集合
Entry<K, V> pollFirstEntry() //获取第一个节点,并删除
Entry<K, V> pollLastEntry() //获取最后一个节点并删除
V put(K key, V value) //插入一个节点
V remove(Object key) //删除键为key的节点
int size() //Map大小
SortedMap<K, V> subMap(K fromInclusive, K toExclusive) //获取从fromInclusive到toExclusive子Map,前闭后开
NavigableMap<K, V> subMap(K from, boolean fromInclusive, K to, boolean toInclusive)
NavigableMap<K, V> tailMap(K from, boolean inclusive) //获取从from开始到最后的子Map,inclusive标志是否包含from
SortedMap<K, V> tailMap(K fromInclusive)
Entry<K, V> ceilingEntry(K key) //返回键不小于key的最小键值对entry
K ceilingKey(K key)//返回键不小于key的最小键
void clear()//清空TreeMapObjectclone()//克隆TreeMap
Comparator<? super K> comparator()//比较器
boolean containsKey(Object key)//是否包含键为key的键值对
NavigableSet<K> descendingKeySet()//获取降序排列key的Set集合
NavigableMap<K, V> descendingMap()//获取降序排列的Map
Set<Entry<K, V>> entrySet()//获取键值对entry的Set集合
Entry<K, V> firstEntry()//第一个entry
K firstKey()//第一个key
Entry<K, V> floorEntry(K key)//获取不大于key的最大键值对
K floorKey(K key)//获取不大于key的最大Key
V get(Object key)//获取键为key的值value
NavigableMap<K, V> headMap(K to, boolean inclusive)//获取从第一个节点开始到to的子Map, inclusive表示是否包含to节点
SortedMap<K, V> headMap(K toExclusive)//获取从第一个节点开始到to的子Map, 不包括toExclusive
Entry<K, V> higherEntry(K key)//获取键大于key的最小键值对
K higherKey(K key)//获取键大于key的最小键
boolean isEmpty()//判空
Set<K> keySet()//获取key的Set集合
Entry<K, V> lastEntry()//最后一个键值对
K lastKey()//最后一个键
Entry<K, V> lowerEntry(K key)//键小于key的最大键值对
K lowerKey(K key)//键小于key的最大键值对
NavigableSet<K> navigableKeySet()//返回key的Set集合
Entry<K, V> pollFirstEntry()//获取第一个节点,并删除
Entry<K, V> pollLastEntry()//获取最后一个节点并删除
V put(K key, V value)//插入一个节点
V remove(Object key)//删除键为key的节点
int size()//Map大小
SortedMap<K, V> subMap(K fromInclusive, K toExclusive)//获取从fromInclusive到toExclusive子Map,前闭后开
NavigableMap<K, V> subMap(K from, boolean fromInclusive, K to, boolean toInclusive)
NavigableMap<K, V> tailMap(K from, boolean inclusive)//获取从from开始到最后的子Map,inclusive标志是否包含from
SortedMap<K, V> tailMap(K fromInclusive) 最后留个大牛写的treemap的深度解析 设计红黑树实现的
https://www.cnblogs.com/chenssy/p/3746600.html
treemap使用了解的更多相关文章
- 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是基于散列表实现的,时间 ...
- HashMap,LinkedHashMap,TreeMap的区别
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...
随机推荐
- Android Studio上传项目到GitHub出错
上传代码到Github出错: 一.github push文件过大(超过50M会有警告,超出100M就会被限制) error: GH001: Large files detected. this exc ...
- CSP-J2019 NOIP普及组初赛真题(选择题部分)
NOIP初赛考试提纲 时间:10月的第2/3个星期六下午14:30~16:30 分数及形式:满分100分,形式为笔试(今年可能上机) 1.单项选择题,共15题,每题2分,共30分 2.阅读程序题,共3 ...
- 教育行业CRM项目开发
项目开发流程 需求分析 存储所有的客户咨询信息 避免重复数据 客户多次跟踪记录 客户来源分析.成单率分析 每个销售只能修改自己的客户信息 报名流程开发 班级 ...
- latex:备忘代码
1.脚注代码: \footnote{欧几里德,约公元前330--340年.} 结果为: 2.改变某个字的字体形状,表示强调 \emph{勾股定理} 结果为(勾股数这三个字与其他字不一样): 3.正文中 ...
- 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!
写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...
- Bellman-Ford算法 例题:P3371 单源最短路径
看到还没人用Bellman-Ford过,赶紧水一发 lz非常弱,求各位大佬轻喷qwq 洛谷题目传送门:P3371 0."松弛"操作 如果存在一条边\((u,v)\)通过中继的方式可 ...
- 【socket编程基础模板】
网络编程的基础是基于socket编程.socket(TCP)编程基于固定编程模板 server端: socket(声明socket类型) bind(命令socket,绑定地址和端口) listen(创 ...
- Linux环境编程进程间通信机制理解
一.Linux系统调用主要函数 二.创建进程 1.创建子进程系统调用fork() 2.验证fork()创建子进程效果 3.系统调用fork()与挂起系统调用wait() 三.模拟进程管道通信 四.pi ...
- js动画和css3动画的区别
JS动画(逐帧动画) 首先,在js动画是逐帧动画,是在时间帧上逐帧绘制帧内容,由于是一帧一帧的话,所以他的可操作性很高,几乎可以完成任何你想要的动画形式.但是由于逐帧动画的帧序列内容不一样,会增加制作 ...
- 贝塞尔曲线(B-spline)的原理与应用
什么是贝塞尔曲线? 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线. 来源 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔(Pierre Béz ...