当前位置:首页 > Java技术 > java集合系列——Map之TreeMap介绍(九)

java集合系列——Map之TreeMap介绍(九)

2022年08月06日 10:05:15Java技术2

一.TreeMap的简介
TreeMap是一个有序的key-value集合,基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。

下面简单介绍一下 红黑树:
1. 根节点是黑色
2. 每个节点都只能是红色或者黑色
3. 每个叶节点(NIL节点,空节点)是黑色的。
4. 如果一个节点是红色的,则它两个子节点都是黑色的,也就是说在一条路径上不能出现两个红色的节点。
5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

二.TreeMap的继承关系

类 TreeMap<K,V>

java.lang.Object
  继承者 java.util.AbstractMap<K,V>
      继承者 java.util.TreeMap<K,V>
类型参数:
K - 此映射维护的键的类型
V - 映射值的类型

继承AbstactMap类,则TreeMap是一个Map,具体key-value特性的集合!

实现了Navigable接口,意味着它支持一系列的导航方法,如有序的key返回。

实现了Cloneable接口,意味着它能被克隆。

实现了Serializable接口,意味着它支持序列化。

三.TreeMap的API
Tree API

1:构造方法

TreeMap() 
          使用键的自然顺序构造一个新的、空的树映射。
TreeMap(Comparator<? super K> comparator) 
          构造一个新的、空的树映射,该映射根据给定比较器进行排序。
TreeMap(Map<? extends K,? extends V> m) 
          构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。
TreeMap(SortedMap<K,? extends V> m) 
          构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。

2:方法

 Map.Entry<K,V> ceilingEntry(K key) 
          返回一个键-值映射关系,它与大于等于给定键的最小键关联;如果不存在这样的键,则返回 null。
 K  ceilingKey(K key) 
          返回大于等于给定键的最小键;如果不存在这样的键,则返回 null。
 void   clear() 
          从此映射中移除所有映射关系。
 Object clone() 
          返回此 TreeMap 实例的浅表副本。
 Comparator<? super K>  comparator() 
          返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 null。
 boolean    containsKey(Object key) 
          如果此映射包含指定键的映射关系,则返回 true。
 boolean    containsValue(Object value) 
          如果此映射为指定值映射一个或多个键,则返回 true。
 NavigableSet<K>    descendingKeySet() 
          返回此映射中所包含键的逆序 NavigableSet 视图。
 NavigableMap<K,V>  descendingMap() 
          返回此映射中所包含映射关系的逆序视图。
 Set<Map.Entry<K,V>>    entrySet() 
          返回此映射中包含的映射关系的 Set 视图。
 Map.Entry<K,V> firstEntry() 
          返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
 K  firstKey() 
          返回此映射中当前第一个(最低)键。
 Map.Entry<K,V> floorEntry(K key) 
          返回一个键-值映射关系,它与小于等于给定键的最大键关联;如果不存在这样的键,则返回 null。
 K  floorKey(K key) 
          返回小于等于给定键的最大键;如果不存在这样的键,则返回 null。
 V  get(Object key) 
          返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。
 SortedMap<K,V> headMap(K toKey) 
          返回此映射的部分视图,其键值严格小于 toKey。
 NavigableMap<K,V>  headMap(K toKey, boolean inclusive) 
          返回此映射的部分视图,其键小于(或等于,如果 inclusive 为 true)toKey。
 Map.Entry<K,V> higherEntry(K key) 
          返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null。
 K  higherKey(K key) 
          返回严格大于给定键的最小键;如果不存在这样的键,则返回 null。
 Set<K> keySet() 
          返回此映射包含的键的 Set 视图。
 Map.Entry<K,V> lastEntry() 
          返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
 K  lastKey() 
          返回映射中当前最后一个(最高)键。
 Map.Entry<K,V> lowerEntry(K key) 
          返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null。
 K  lowerKey(K key) 
          返回严格小于给定键的最大键;如果不存在这样的键,则返回 null。
 NavigableSet<K>    navigableKeySet() 
          返回此映射中所包含键的 NavigableSet 视图。
 Map.Entry<K,V> pollFirstEntry() 
          移除并返回与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
 Map.Entry<K,V> pollLastEntry() 
          移除并返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
 V  put(K key, V value) 
          将指定值与此映射中的指定键进行关联。
 void   putAll(Map<? extends K,? extends V> map) 
          将指定映射中的所有映射关系复制到此映射中。
 V  remove(Object key) 
          如果此 TreeMap 中存在该键的映射关系,则将其删除。
 int    size() 
          返回此映射中的键-值映射关系数。
 NavigableMap<K,V>  subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) 
          返回此映射的部分视图,其键的范围从 fromKey 到 toKey。
 SortedMap<K,V> subMap(K fromKey, K toKey) 
          返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。
 SortedMap<K,V> tailMap(K fromKey) 
          返回此映射的部分视图,其键大于等于 fromKey。
 NavigableMap<K,V>  tailMap(K fromKey, boolean inclusive) 
          返回此映射的部分视图,其键大于(或等于,如果 inclusive 为 true)fromKey。
 Collection<V>  values() 
          返回此映射包含的值的 Collection 视图。

四.源码

源码和16基本相同,这里不做分析,可以查看参考文章。里面有详细的介绍!

五.总结

1、TreeMap是根据key进行排序的,它的排序和定位需要依赖比较器或覆写Comparable接口,也因此不需要key覆写hashCode方法和equals方法,就可以排除掉重复的key,而HashMap的key则需要通过覆写hashCode方法和equals方法来确保没有重复的key。

2、TreeMap的查询、插入、删除效率均没有HashMap高,一般只有要对key排序时才使用TreeMap。

3、TreeMap的key不能为null,而HashMap的key可以为null。

4、TreeMap不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

参考文章:
1:【数据结构与算法】二叉排序树C实现(含完整源码)
2:红黑树(一)之 原理和算法详细介绍
3: TreeMap源码剖析

4:TreeMap详细介绍(源码解析)和使用示例

java集合系列——java集合概述(一)
java集合系列——List集合之ArrayList介绍(二)
java集合系列——List集合之LinkedList介绍(三)
java集合系列——List集合之Vector介绍(四)
java集合系列——List集合之Stack介绍(五)
java集合系列——List集合总结(六)
java集合系列——Map介绍(七)
java集合系列——Map之HashMap介绍(八)
java集合系列——Map之TreeMap介绍(九)
java集合系列——Set之HashSet和TreeSet介绍(十)



如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页http://blog.csdn.net/u010648555

作者:阿飞云
来源链接:https://blog.csdn.net/u010648555/article/details/60476232

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/18263.html

标签: Java集合Java
分享给朋友:

“java集合系列——Map之TreeMap介绍(九)” 的相关文章

一分钟搞定Java环境变量配置

一分钟搞定Java环境变量配置

对于学Java的人来说,成功配置环境变量是第一步,因为后期不论 你做什么工作,会发现都需要这些,接下来介绍如何安装与配置,我按照jdk1.6来说明,其他一致。 下载官网 首先将jdk安装好后进行配置。 右击“计算机”,右键打开“属性”,...

Java中四种访问修饰符的区别

在java中共有4种访问级别,按访问权限由高到低为:public(公有的)、protected(受保护的)、友好的(没有任何访问权限关键字修饰)和private(私有的)。 类型 类内部 同一个包其...

深入理解 Java 并发锁

深入理解 Java 并发锁

📦 本文以及示例源码已归档在 javacore 一、并发锁简介 确保线程安全最常见的做法是利用锁机制(Lock、sychronized)来对共享数据做互斥同步,这样在同一个时刻,只有一个线程可以执行某个方法或者某个代码块,那么操作必然是原子性的,线程安全的...

Java 并发核心机制

Java 并发核心机制

📦 本文以及示例源码已归档在 javacore 一、J.U.C 简介 Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。...

Java 内存模型

Java 内存模型

📦 本文以及示例源码已归档在 javacore Java 内存模型(Java Memory Model),简称 JMM。 JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。...

Java 日志框架详解

Java 日志框架详解

1. JUL学习 JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框 架使用方便,学习简单,能够在小型应用中灵活使用。 1.1 架构介绍 Loggers...

冒泡排序的原理,思路,以及算法分析(Java实现)

冒泡排序的原理,思路,以及算法分析(Java实现)

冒泡排序 如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。 1.原理:比较两个相邻的元素,将值大的元素交换到右边 2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。 (1)第一次比较:首先比较第...

java计数循环及小技巧

要运行一个很大次数的循环应该选择一个小数,然后去判断 例如本例子是100可以选择10去判断 public static void main(String[] args) { // TODO Auto-generated metho...

java比较语句常犯错误和三个数比较大小

1.忘了大括号 解决: 任何if else语句后面加大括号,哪怕只有一句 2.忘了分号 if后面不能有分号 3.代码分格 Scanner in=new Scanner(System.in); int x; int y; int z;...

JAVA的JDK环境变量的配置JAVA

JAVA的JDK环境变量的配置JAVA

首先要在官网下载java 官网:http://www.oracle.com/technetwork/java/javase/downloads/ 到这个界面 选择我接受 记住该地址 最好的办法新建记事本,然后按ctrl+s保存 java环境变量的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。